From b149dffe407db1141b06260c0852bb90584d03f0 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 4 Dec 2024 00:33:27 +0000 Subject: [PATCH] Publish ESMPy Docs --- docs/nightly/fix/reconcile-info/ESMPy.pdf | Bin 0 -> 447995 bytes .../fix/reconcile-info/html/.buildinfo | 4 + .../fix/reconcile-info/html/CoordSys.html | 165 +++ .../fix/reconcile-info/html/ExtrapMethod.html | 176 +++ .../fix/reconcile-info/html/FileFormat.html | 176 +++ .../fix/reconcile-info/html/FileMode.html | 146 ++ .../fix/reconcile-info/html/GridItem.html | 148 ++ .../fix/reconcile-info/html/LineType.html | 160 ++ .../fix/reconcile-info/html/LogKind.html | 146 ++ .../fix/reconcile-info/html/MeshElemType.html | 164 +++ .../fix/reconcile-info/html/MeshLoc.html | 146 ++ .../fix/reconcile-info/html/NormType.html | 154 ++ .../fix/reconcile-info/html/PoleKind.html | 155 ++ .../fix/reconcile-info/html/PoleMethod.html | 177 +++ .../fix/reconcile-info/html/Region.html | 156 ++ .../fix/reconcile-info/html/RegridMethod.html | 215 +++ .../fix/reconcile-info/html/StaggerLoc.html | 219 +++ .../fix/reconcile-info/html/TypeKind.html | 161 ++ .../reconcile-info/html/UnmappedAction.html | 136 ++ .../html/_sources/CoordSys.rst.txt | 7 + .../html/_sources/ExtrapMethod.rst.txt | 7 + .../html/_sources/FileFormat.rst.txt | 7 + .../html/_sources/FileMode.rst.txt | 7 + .../html/_sources/GridItem.rst.txt | 7 + .../html/_sources/LineType.rst.txt | 7 + .../html/_sources/LogKind.rst.txt | 7 + .../html/_sources/MeshElemType.rst.txt | 7 + .../html/_sources/MeshLoc.rst.txt | 7 + .../html/_sources/NormType.rst.txt | 7 + .../html/_sources/PoleKind.rst.txt | 7 + .../html/_sources/PoleMethod.rst.txt | 7 + .../html/_sources/Region.rst.txt | 7 + .../html/_sources/RegridMethod.rst.txt | 7 + .../html/_sources/StaggerLoc.rst.txt | 7 + .../html/_sources/TypeKind.rst.txt | 7 + .../html/_sources/UnmappedAction.rst.txt | 7 + .../reconcile-info/html/_sources/api.rst.txt | 954 ++++++++++++ .../html/_sources/appendix.rst.txt | 49 + .../html/_sources/examples.rst.txt | 139 ++ .../html/_sources/field.rst.txt | 9 + .../reconcile-info/html/_sources/grid.rst.txt | 9 + .../html/_sources/index.rst.txt | 24 + .../html/_sources/install.rst.txt | 162 ++ .../html/_sources/intro.rst.txt | 30 + .../html/_sources/locstream.rst.txt | 6 + .../html/_sources/manager.rst.txt | 6 + .../reconcile-info/html/_sources/mesh.rst.txt | 7 + .../html/_sources/regrid.rst.txt | 6 + .../html/_sources/regridfromfile.rst.txt | 6 + .../fix/reconcile-info/html/_static/basic.css | 921 ++++++++++++ .../reconcile-info/html/_static/classic.css | 269 ++++ .../reconcile-info/html/_static/doctools.js | 156 ++ .../html/_static/documentation_options.js | 14 + .../fix/reconcile-info/html/_static/file.png | Bin 0 -> 286 bytes .../html/_static/language_data.js | 199 +++ .../fix/reconcile-info/html/_static/minus.png | Bin 0 -> 90 bytes .../fix/reconcile-info/html/_static/plus.png | Bin 0 -> 90 bytes .../reconcile-info/html/_static/pygments.css | 75 + .../html/_static/searchtools.js | 566 +++++++ .../reconcile-info/html/_static/sidebar.js | 70 + .../html/_static/sphinx_highlight.js | 144 ++ docs/nightly/fix/reconcile-info/html/api.html | 1076 ++++++++++++++ .../fix/reconcile-info/html/appendix.html | 425 ++++++ .../fix/reconcile-info/html/examples.html | 1298 +++++++++++++++++ .../fix/reconcile-info/html/field.html | 387 +++++ .../fix/reconcile-info/html/genindex.html | 633 ++++++++ .../nightly/fix/reconcile-info/html/grid.html | 655 +++++++++ .../fix/reconcile-info/html/index.html | 221 +++ .../fix/reconcile-info/html/install.html | 268 ++++ .../fix/reconcile-info/html/intro.html | 193 +++ .../fix/reconcile-info/html/locstream.html | 299 ++++ .../fix/reconcile-info/html/manager.html | 233 +++ .../nightly/fix/reconcile-info/html/mesh.html | 464 ++++++ .../fix/reconcile-info/html/objects.inv | Bin 0 -> 1766 bytes .../fix/reconcile-info/html/py-modindex.html | 101 ++ .../fix/reconcile-info/html/regrid.html | 366 +++++ .../reconcile-info/html/regridfromfile.html | 210 +++ .../fix/reconcile-info/html/search.html | 102 ++ .../fix/reconcile-info/html/searchindex.js | 1 + 79 files changed, 13676 insertions(+) create mode 100644 docs/nightly/fix/reconcile-info/ESMPy.pdf create mode 100644 docs/nightly/fix/reconcile-info/html/.buildinfo create mode 100644 docs/nightly/fix/reconcile-info/html/CoordSys.html create mode 100644 docs/nightly/fix/reconcile-info/html/ExtrapMethod.html create mode 100644 docs/nightly/fix/reconcile-info/html/FileFormat.html create mode 100644 docs/nightly/fix/reconcile-info/html/FileMode.html create mode 100644 docs/nightly/fix/reconcile-info/html/GridItem.html create mode 100644 docs/nightly/fix/reconcile-info/html/LineType.html create mode 100644 docs/nightly/fix/reconcile-info/html/LogKind.html create mode 100644 docs/nightly/fix/reconcile-info/html/MeshElemType.html create mode 100644 docs/nightly/fix/reconcile-info/html/MeshLoc.html create mode 100644 docs/nightly/fix/reconcile-info/html/NormType.html create mode 100644 docs/nightly/fix/reconcile-info/html/PoleKind.html create mode 100644 docs/nightly/fix/reconcile-info/html/PoleMethod.html create mode 100644 docs/nightly/fix/reconcile-info/html/Region.html create mode 100644 docs/nightly/fix/reconcile-info/html/RegridMethod.html create mode 100644 docs/nightly/fix/reconcile-info/html/StaggerLoc.html create mode 100644 docs/nightly/fix/reconcile-info/html/TypeKind.html create mode 100644 docs/nightly/fix/reconcile-info/html/UnmappedAction.html create mode 100644 docs/nightly/fix/reconcile-info/html/_sources/CoordSys.rst.txt create mode 100644 docs/nightly/fix/reconcile-info/html/_sources/ExtrapMethod.rst.txt create mode 100644 docs/nightly/fix/reconcile-info/html/_sources/FileFormat.rst.txt create mode 100644 docs/nightly/fix/reconcile-info/html/_sources/FileMode.rst.txt create mode 100644 docs/nightly/fix/reconcile-info/html/_sources/GridItem.rst.txt create mode 100644 docs/nightly/fix/reconcile-info/html/_sources/LineType.rst.txt create mode 100644 docs/nightly/fix/reconcile-info/html/_sources/LogKind.rst.txt create mode 100644 docs/nightly/fix/reconcile-info/html/_sources/MeshElemType.rst.txt create mode 100644 docs/nightly/fix/reconcile-info/html/_sources/MeshLoc.rst.txt create mode 100644 docs/nightly/fix/reconcile-info/html/_sources/NormType.rst.txt create mode 100644 docs/nightly/fix/reconcile-info/html/_sources/PoleKind.rst.txt create mode 100644 docs/nightly/fix/reconcile-info/html/_sources/PoleMethod.rst.txt create mode 100644 docs/nightly/fix/reconcile-info/html/_sources/Region.rst.txt create mode 100644 docs/nightly/fix/reconcile-info/html/_sources/RegridMethod.rst.txt create mode 100644 docs/nightly/fix/reconcile-info/html/_sources/StaggerLoc.rst.txt create mode 100644 docs/nightly/fix/reconcile-info/html/_sources/TypeKind.rst.txt create mode 100644 docs/nightly/fix/reconcile-info/html/_sources/UnmappedAction.rst.txt create mode 100644 docs/nightly/fix/reconcile-info/html/_sources/api.rst.txt create mode 100644 docs/nightly/fix/reconcile-info/html/_sources/appendix.rst.txt create mode 100644 docs/nightly/fix/reconcile-info/html/_sources/examples.rst.txt create mode 100644 docs/nightly/fix/reconcile-info/html/_sources/field.rst.txt create mode 100644 docs/nightly/fix/reconcile-info/html/_sources/grid.rst.txt create mode 100644 docs/nightly/fix/reconcile-info/html/_sources/index.rst.txt create mode 100644 docs/nightly/fix/reconcile-info/html/_sources/install.rst.txt create mode 100644 docs/nightly/fix/reconcile-info/html/_sources/intro.rst.txt create mode 100644 docs/nightly/fix/reconcile-info/html/_sources/locstream.rst.txt create mode 100644 docs/nightly/fix/reconcile-info/html/_sources/manager.rst.txt create mode 100644 docs/nightly/fix/reconcile-info/html/_sources/mesh.rst.txt create mode 100644 docs/nightly/fix/reconcile-info/html/_sources/regrid.rst.txt create mode 100644 docs/nightly/fix/reconcile-info/html/_sources/regridfromfile.rst.txt create mode 100644 docs/nightly/fix/reconcile-info/html/_static/basic.css create mode 100644 docs/nightly/fix/reconcile-info/html/_static/classic.css create mode 100644 docs/nightly/fix/reconcile-info/html/_static/doctools.js create mode 100644 docs/nightly/fix/reconcile-info/html/_static/documentation_options.js create mode 100644 docs/nightly/fix/reconcile-info/html/_static/file.png create mode 100644 docs/nightly/fix/reconcile-info/html/_static/language_data.js create mode 100644 docs/nightly/fix/reconcile-info/html/_static/minus.png create mode 100644 docs/nightly/fix/reconcile-info/html/_static/plus.png create mode 100644 docs/nightly/fix/reconcile-info/html/_static/pygments.css create mode 100644 docs/nightly/fix/reconcile-info/html/_static/searchtools.js create mode 100644 docs/nightly/fix/reconcile-info/html/_static/sidebar.js create mode 100644 docs/nightly/fix/reconcile-info/html/_static/sphinx_highlight.js create mode 100644 docs/nightly/fix/reconcile-info/html/api.html create mode 100644 docs/nightly/fix/reconcile-info/html/appendix.html create mode 100644 docs/nightly/fix/reconcile-info/html/examples.html create mode 100644 docs/nightly/fix/reconcile-info/html/field.html create mode 100644 docs/nightly/fix/reconcile-info/html/genindex.html create mode 100644 docs/nightly/fix/reconcile-info/html/grid.html create mode 100644 docs/nightly/fix/reconcile-info/html/index.html create mode 100644 docs/nightly/fix/reconcile-info/html/install.html create mode 100644 docs/nightly/fix/reconcile-info/html/intro.html create mode 100644 docs/nightly/fix/reconcile-info/html/locstream.html create mode 100644 docs/nightly/fix/reconcile-info/html/manager.html create mode 100644 docs/nightly/fix/reconcile-info/html/mesh.html create mode 100644 docs/nightly/fix/reconcile-info/html/objects.inv create mode 100644 docs/nightly/fix/reconcile-info/html/py-modindex.html create mode 100644 docs/nightly/fix/reconcile-info/html/regrid.html create mode 100644 docs/nightly/fix/reconcile-info/html/regridfromfile.html create mode 100644 docs/nightly/fix/reconcile-info/html/search.html create mode 100644 docs/nightly/fix/reconcile-info/html/searchindex.js diff --git a/docs/nightly/fix/reconcile-info/ESMPy.pdf b/docs/nightly/fix/reconcile-info/ESMPy.pdf new file mode 100644 index 0000000000000000000000000000000000000000..645c0d4bd46c77e10f948d72ebba14d17aeefaba GIT binary patch literal 447995 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

8s|ce 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 T_#luFSX2a`jZIlo1^<5ma$F_| literal 0 HcmV?d00001 diff --git a/docs/nightly/fix/reconcile-info/html/.buildinfo b/docs/nightly/fix/reconcile-info/html/.buildinfo new file mode 100644 index 00000000..20fb2b34 --- /dev/null +++ b/docs/nightly/fix/reconcile-info/html/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. +config: 9a7b71e66bbdff19ccf1e1465780cd5a +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/docs/nightly/fix/reconcile-info/html/CoordSys.html b/docs/nightly/fix/reconcile-info/html/CoordSys.html new file mode 100644 index 00000000..17a7fb2b --- /dev/null +++ b/docs/nightly/fix/reconcile-info/html/CoordSys.html @@ -0,0 +1,165 @@ + + + + + + + + CoordSys — ESMPy 8.8.0b0 documentation + + + + + + + + + + + + +

+ +
+
+
+
+ +
+

CoordSys

+
+
+class esmpy.api.constants.CoordSys(value, names=None, module=None, type=None, start=1)
+

This flag indicates the coordinate system of a Grid. This value is +useful both to indicate to other users the type of the coordinates, +but also to control how the coordinates are interpreted in +regridding methods (e.g. Regrid).

+
+
+CART = <CoordSys.CART: 0>
+

Cartesian coordinate system. In this system, the Cartesian +coordinates are mapped to the Grid coordinate dimensions in the +following order: x, y, z. (e.g. using coord_dim=1 in +get_coords() references the y dimension)

+
+ +
+
+SPH_DEG = <CoordSys.SPH_DEG: 1>
+

Spherical coordinates in degrees. In this system, the spherical +coordinates are mapped to the Grid coordinate dimensions in the +following order: longitude, latitude, radius. (E.g. using +coord_dim=1 in get_coords()` references the latitude dimension).

+
+ +
+
+SPH_RAD = <CoordSys.SPH_RAD: 2>
+

Spherical coordinates in radians. In this system, the spherical +coordinates are mapped to the Grid coordinate dimensions in the +following order: longitude, latitude, radius. (E.g. using +coord_dim=1 in get_coords() references the latitude dimension).

+
+ +
+ +
+ + +
+
+
+
+ +
+
+ + + + \ No newline at end of file diff --git a/docs/nightly/fix/reconcile-info/html/ExtrapMethod.html b/docs/nightly/fix/reconcile-info/html/ExtrapMethod.html new file mode 100644 index 00000000..9b270599 --- /dev/null +++ b/docs/nightly/fix/reconcile-info/html/ExtrapMethod.html @@ -0,0 +1,176 @@ + + + + + + + + ExtrapMethod — ESMPy 8.8.0b0 documentation + + + + + + + + + + + + + + +
+
+
+
+ +
+

ExtrapMethod

+
+
+class esmpy.api.constants.ExtrapMethod(value, names=None, module=None, type=None, start=1)
+

Specify which extrapolation method to use on unmapped destination points after +regridding.

+
+
+NONE = <ExtrapMethod.NONE: 0>
+

Indicates that no extrapolation should be done.

+
+ +
+
+NEAREST_STOD = <ExtrapMethod.NEAREST_STOD: 1>
+

Nearest source to destination. +Here each destination point is mapped to the closest source point. A given +source point may go to multiple destination points, but no destination +point will receive input from more than one source point.

+
+ +
+
+NEAREST_IDAVG = <ExtrapMethod.NEAREST_IDAVG: 2>
+

Inverse distance weighted average. +Here the value of a destination point is the weighted average of the +closest N source points. The weight is the reciprocal of the distance of +the source point from the destination point raised to a power P. All the +weights contributing to one destination point are normalized so that they +sum to 1.0. The user can choose N and P when using this method, but +defaults are also provided.

+
+ +
+
+CREEP_FILL = <ExtrapMethod.CREEP_FILL: 3>
+

Creep fill extrapolation. +Here unmapped destination points are filled by repeatedly moving data from +mapped locations to neighboring unmapped locations. The data filled into a +new location is the average of its already filled neighbors’ values. This +process is repeated for a user specified number of levels (e.g. in Regrid() +this is specified via the extrap_num_levels parameter). This extrapolation +method is not supported with conservative regrid methods.

+
+ +
+ +
+ + +
+
+
+
+ +
+
+ + + + \ No newline at end of file diff --git a/docs/nightly/fix/reconcile-info/html/FileFormat.html b/docs/nightly/fix/reconcile-info/html/FileFormat.html new file mode 100644 index 00000000..fa8c50d7 --- /dev/null +++ b/docs/nightly/fix/reconcile-info/html/FileFormat.html @@ -0,0 +1,176 @@ + + + + + + + + FileFormat — ESMPy 8.8.0b0 documentation + + + + + + + + + + + + + + +
+
+
+
+ +
+

FileFormat

+
+
+class esmpy.api.constants.FileFormat(value, names=None, module=None, type=None, start=1)
+

The Grid and Mesh objects +may be created from specifications in a NetCDF data file. This flag +indicates the format of the data file.

+
+
+VTK = <FileFormat.VTK: 1>
+

Use the VTK file format.

+
+ +
+
+SCRIP = <FileFormat.SCRIP: 2>
+

Use the SCRIP file format.

+
+ +
+
+ESMFMESH = <FileFormat.ESMFMESH: 3>
+

Use the ESMFMESH unstructured grid file format.

+
+ +
+
+ESMFGRID = <FileFormat.ESMFGRID: 4>
+

Use the ESMF structured grid file format.

+
+ +
+
+UGRID = <FileFormat.UGRID: 5>
+

Use the UGRID unstructured grid file format.

+
+ +
+
+GRIDSPEC = <FileFormat.GRIDSPEC: 6>
+

Use the UGRID single tile grid file format based on CF V1.6 conventions (a.k.a GRIDSPEC).

+
+ +
+ +
+ + +
+
+
+
+ +
+
+ + + + \ No newline at end of file diff --git a/docs/nightly/fix/reconcile-info/html/FileMode.html b/docs/nightly/fix/reconcile-info/html/FileMode.html new file mode 100644 index 00000000..0085a1b9 --- /dev/null +++ b/docs/nightly/fix/reconcile-info/html/FileMode.html @@ -0,0 +1,146 @@ + + + + + + + + FileMode — ESMPy 8.8.0b0 documentation + + + + + + + + + + + + + + +
+
+
+
+ +
+

FileMode

+
+
+class esmpy.api.constants.FileMode(value, names=None, module=None, type=None, start=1)
+

Specify which mode to use when writing a weight file.

+
+
+BASIC = <FileMode.BASIC: 0>
+

Indicates that only the factorList and factorIndexList should be written.

+
+ +
+
+WITHAUX = <FileMode.WITHAUX: 1>
+

Indicates that grid center coordinates and cell areas should also be written.

+
+ +
+ +
+ + +
+
+
+
+ +
+
+ + + + \ No newline at end of file diff --git a/docs/nightly/fix/reconcile-info/html/GridItem.html b/docs/nightly/fix/reconcile-info/html/GridItem.html new file mode 100644 index 00000000..c85c6ddb --- /dev/null +++ b/docs/nightly/fix/reconcile-info/html/GridItem.html @@ -0,0 +1,148 @@ + + + + + + + + GridItem — ESMPy 8.8.0b0 documentation + + + + + + + + + + + + + + +
+
+
+
+ +
+

GridItem

+
+
+class esmpy.api.constants.GridItem(value, names=None, module=None, type=None, start=1)
+

The Grid can contain other kinds of data besides coordinates. This +data is referred to as Grid “items”. Some items may be used +for calculations involving the Grid.

+
+
+MASK = <GridItem.MASK: 0>
+

A grid item to represent a mask.

+
+ +
+
+AREA = <GridItem.AREA: 1>
+

A grid item to represent an area field for conservative regridding.

+
+ +
+ +
+ + +
+
+
+
+ +
+
+ + + + \ No newline at end of file diff --git a/docs/nightly/fix/reconcile-info/html/LineType.html b/docs/nightly/fix/reconcile-info/html/LineType.html new file mode 100644 index 00000000..4c837c92 --- /dev/null +++ b/docs/nightly/fix/reconcile-info/html/LineType.html @@ -0,0 +1,160 @@ + + + + + + + + LineType — ESMPy 8.8.0b0 documentation + + + + + + + + + + + + + + +
+
+
+
+ +
+

LineType

+
+
+class esmpy.api.constants.LineType(value, names=None, module=None, type=None, start=1)
+

This argument controls the path of the line which connects two points on +the surface of the sphere. This in turn controls the path along which +distances are calculated and the shape of the edges that make up a cell. +Both of these quantities can influence how interpolation weights are +calculated. As would be expected, this argument is only applicable with +grids which lie on the surface of a sphere.

+
+
+CART = <LineType.CART: 0>
+

Cartesian line. When this option is specified distances are calculated in a +straight line through the 3D Cartesian space in which the sphere is +embedded. Cells are approximated by 3D planes bounded by 3D Cartesian lines +between their corner vertices. When calculating regrid weights, this line +type is currently the default for the following all regrid methods except +for conservative.

+
+ +
+
+GREAT_CIRCLE = <LineType.GREAT_CIRCLE: 1>
+

Great circle line. When this option is specified distances are calculated +along a great circle path (the shortest distance between two points on a +sphere surface). Cells are bounded by great circle paths between their +corner vertices. When calculating regrid weights, this line type is +currently the default for the conservative regrid method.

+
+ +
+ +
+ + +
+
+
+
+ +
+
+ + + + \ No newline at end of file diff --git a/docs/nightly/fix/reconcile-info/html/LogKind.html b/docs/nightly/fix/reconcile-info/html/LogKind.html new file mode 100644 index 00000000..6d69101c --- /dev/null +++ b/docs/nightly/fix/reconcile-info/html/LogKind.html @@ -0,0 +1,146 @@ + + + + + + + + LogKind — ESMPy 8.8.0b0 documentation + + + + + + + + + + + + + + +
+
+
+
+ +
+

LogKind

+
+
+class esmpy.api.constants.LogKind(value, names=None, module=None, type=None, start=1)
+

This flag is used to specify how much logging should be done.

+
+
+MULTI = <LogKind.MULTI: 2>
+

Use multiple log files – one per PET.

+
+ +
+
+NONE = <LogKind.NONE: 3>
+

Do not issue messages to a log file.

+
+ +
+ +
+ + +
+
+
+
+ +
+
+ + + + \ No newline at end of file diff --git a/docs/nightly/fix/reconcile-info/html/MeshElemType.html b/docs/nightly/fix/reconcile-info/html/MeshElemType.html new file mode 100644 index 00000000..8579845b --- /dev/null +++ b/docs/nightly/fix/reconcile-info/html/MeshElemType.html @@ -0,0 +1,164 @@ + + + + + + + + MeshElemType — ESMPy 8.8.0b0 documentation + + + + + + + + + + + + + + +
+
+
+
+ +
+

MeshElemType

+
+
+class esmpy.api.constants.MeshElemType(value, names=None, module=None, type=None, start=1)
+

A Mesh can be constructed from a combination of different elements. +The type of elements that can be used in a Mesh depends on the +parametric dimension of the Mesh, which is set during Mesh +creation. The following are the valid Mesh element types for each +valid Mesh parametric dimension (2D or 3D).

+
+
+TRI = <MeshElemType.TRI: 3>
+

2D triangular elements with 3 sides.

+
+ +
+
+QUAD = <MeshElemType.QUAD: 4>
+

2D quadrilateral elements with 4 sides.

+
+ +
+
+TETRA = <MeshElemType.TETRA: 10>
+

3D tetrahedral elements with 4 faces.

+
+ +
+
+HEX = <MeshElemType.HEX: 12>
+

3D hexahedral elements with 6 faces.

+
+ +
+ +
+ + +
+
+
+
+ +
+
+ + + + \ No newline at end of file diff --git a/docs/nightly/fix/reconcile-info/html/MeshLoc.html b/docs/nightly/fix/reconcile-info/html/MeshLoc.html new file mode 100644 index 00000000..77dd7d60 --- /dev/null +++ b/docs/nightly/fix/reconcile-info/html/MeshLoc.html @@ -0,0 +1,146 @@ + + + + + + + + MeshLoc — ESMPy 8.8.0b0 documentation + + + + + + + + + + + + + + +
+
+
+
+ +
+

MeshLoc

+
+
+class esmpy.api.constants.MeshLoc(value, names=None, module=None, type=None, start=1)
+

The Mesh location used to hold Field data.

+
+
+NODE = <MeshLoc.NODE: 0>
+

The nodes of the Mesh.

+
+ +
+
+ELEMENT = <MeshLoc.ELEMENT: 1>
+

The elements of the Mesh.

+
+ +
+ +
+ + +
+
+
+
+ +
+
+ + + + \ No newline at end of file diff --git a/docs/nightly/fix/reconcile-info/html/NormType.html b/docs/nightly/fix/reconcile-info/html/NormType.html new file mode 100644 index 00000000..bd9105a2 --- /dev/null +++ b/docs/nightly/fix/reconcile-info/html/NormType.html @@ -0,0 +1,154 @@ + + + + + + + + NormType — ESMPy 8.8.0b0 documentation + + + + + + + + + + + + + + +
+
+
+
+ +
+

NormType

+
+
+class esmpy.api.constants.NormType(value, names=None, module=None, type=None, start=1)
+

When doing conservative regridding, this option allows the user +to select the type of normalization used when producing the weights.

+
+
+DSTAREA = <NormType.DSTAREA: 0>
+

Destination area normalization. Here the weights are calculated by dividing +the area of overlap of the source and destination cells by the area of the +entire destination cell. In other words, the weight is the fraction of the +entire destination cell which overlaps with the given source cell.

+
+ +
+
+FRACAREA = <NormType.FRACAREA: 1>
+

Fraction area normalization. Here in addition to the weight calculation +done for destination area normalization the weights are also divided by the +fraction that the destination cell overlaps with the entire source grid. In +other words, the weight is the fraction of just the part of the destination +cell that overlaps with the entire source mesh.

+
+ +
+ +
+ + +
+
+
+
+ +
+
+ + + + \ No newline at end of file diff --git a/docs/nightly/fix/reconcile-info/html/PoleKind.html b/docs/nightly/fix/reconcile-info/html/PoleKind.html new file mode 100644 index 00000000..27e32283 --- /dev/null +++ b/docs/nightly/fix/reconcile-info/html/PoleKind.html @@ -0,0 +1,155 @@ + + + + + + + + PoleKind — ESMPy 8.8.0b0 documentation + + + + + + + + + + + + + + +
+
+
+
+ +
+

PoleKind

+
+
+class esmpy.api.constants.PoleKind(value, names=None, module=None, type=None, start=1)
+

This type describes the type of connection that occurs at the pole of a +Grid.

+
+
+NONE = <PoleKind.NONE: 0>
+

No connection at pole.

+
+ +
+
+MONOPOLE = <PoleKind.MONOPOLE: 1>
+

This edge is connected to itself. Given that the edge is n elements long, +then element i is connected to element i+n/2.

+
+ +
+
+BIPOLE = <PoleKind.BIPOLE: 2>
+

This edge is connected to itself. Given that the edge is n elements long, element i is connected to element n-i-1.

+
+ +
+ +
+ + +
+
+
+
+ +
+
+ + + + \ No newline at end of file diff --git a/docs/nightly/fix/reconcile-info/html/PoleMethod.html b/docs/nightly/fix/reconcile-info/html/PoleMethod.html new file mode 100644 index 00000000..aa3865a8 --- /dev/null +++ b/docs/nightly/fix/reconcile-info/html/PoleMethod.html @@ -0,0 +1,177 @@ + + + + + + + + PoleMethod — ESMPy 8.8.0b0 documentation + + + + + + + + + + + + + + +
+
+
+
+ +
+

PoleMethod

+
+
+class esmpy.api.constants.PoleMethod(value, names=None, module=None, type=None, start=1)
+

Indicates which type of artificial pole to construct on the source +Grid for regridding.

+
+
+NONE = <PoleMethod.NONE: 0>
+

No pole. Destination points which lie above the top or below the bottom row +of the source Grid won’t be mapped.

+
+ +
+
+ALLAVG = <PoleMethod.ALLAVG: 1>
+

Construct an artificial pole placed in the center of the top (or bottom) +row of nodes, but projected onto the sphere formed by the rest of the grid. +The value at this pole is the average of all the source values surrounding +the pole.

+
+ +
+
+NPNTAVG = <PoleMethod.NPNTAVG: 2>
+

Construct an artificial pole placed in the center of the top (or bottom) +row of nodes, but projected onto the sphere formed by the rest of the grid. +The value at this pole is the average of the N source nodes next to the pole +and surrounding the destination point (i.e. the value may differ for each +destination point). Here N is set by using the regridPoleNPnts parameter +and ranges from 1 to the number of nodes around the pole. This option is +useful for interpolating values which may be zeroed out by averaging around +the entire pole (e.g. vector components).

+
+ +
+
+TEETH = <PoleMethod.TEETH: 3>
+

No new pole point is constructed, instead the holes at the poles are filled +by constructing triangles across the top and bottom row of the source Grid. +This can be useful because no averaging occurs, however, because the top and +bottom of the sphere are now flat, for a big enough mismatch between the +size of the destination and source pole holes, some destination points may +still not be able to be mapped to the source Grid.

+
+ +
+ +
+ + +
+
+
+
+ +
+
+ + + + \ No newline at end of file diff --git a/docs/nightly/fix/reconcile-info/html/Region.html b/docs/nightly/fix/reconcile-info/html/Region.html new file mode 100644 index 00000000..39a8763c --- /dev/null +++ b/docs/nightly/fix/reconcile-info/html/Region.html @@ -0,0 +1,156 @@ + + + + + + + + Region — ESMPy 8.8.0b0 documentation + + + + + + + + + + + + + + +
+
+
+
+ +
+

Region

+
+
+class esmpy.api.constants.Region(value, names=None, module=None, type=None, start=1)
+

Specify various regions in the data layout of a Field object.

+
+
+TOTAL = <Region.TOTAL: 0>
+

An operation applies to every element in the selected domain.

+
+ +
+
+SELECT = <Region.SELECT: 1>
+

An operation applies to a select portion of the domain. One use of this is +to specify that the portions of a Field that are not mapped in a regridding +operation should retain their original value (as opposed to being +initialized to 0).

+
+ +
+
+EMPTY = <Region.EMPTY: 2>
+

An operation does not apply any element in the domain.

+
+ +
+ +
+ + +
+
+
+
+ +
+
+ + + + \ No newline at end of file diff --git a/docs/nightly/fix/reconcile-info/html/RegridMethod.html b/docs/nightly/fix/reconcile-info/html/RegridMethod.html new file mode 100644 index 00000000..0647c6ea --- /dev/null +++ b/docs/nightly/fix/reconcile-info/html/RegridMethod.html @@ -0,0 +1,215 @@ + + + + + + + + RegridMethod — ESMPy 8.8.0b0 documentation + + + + + + + + + + + + + + +
+
+
+
+ +
+

RegridMethod

+
+
+class esmpy.api.constants.RegridMethod(value, names=None, module=None, type=None, start=1)
+

Specify which interpolation method to use during regridding.

+
+
+BILINEAR = <RegridMethod.BILINEAR: 0>
+

Bilinear interpolation. Destination value is a linear combination of the +source values in the cell which contains the destination point. The +weights for the linear combination are based on the distance of destination +point from each source value.

+
+ +
+
+PATCH = <RegridMethod.PATCH: 1>
+

Higher-order patch recovery interpolation. Destination value is a weighted +average of 2D polynomial patches constructed from cells surrounding the +source cell which contains the destination point. This method typically +results in better approximations to values and derivatives than bilinear. +However, because of its larger stencil, it also results in a much larger +interpolation matrix (and thus routeHandle) than the bilinear.

+
+ +
+
+CONSERVE = <RegridMethod.CONSERVE: 2>
+

First-order conservative interpolation. The main purpose of this method is +to preserve the integral of the field across the interpolation from source +to destination. In this method the value across each source cell is treated +as a constant, so it will typically have a larger interpolation error than +the bilinear or patch methods. The value of a destination cell +is calculated as the weighted sum of the values of the source cells that it +overlaps. The weights are determined by the amount the source cell overlaps +the destination cell. This method requires corner coordinate values to be +provided in the Grid. It currently only works for +Fields <esmpy.api.field.Field>`s created on the +:class:`~esmpy.api.grid.Grid center stagger or +the Mesh element location.

+
+ +
+
+NEAREST_STOD = <RegridMethod.NEAREST_STOD: 3>
+

In this version of nearest neighbor interpolation each destination point is +mapped to the closest source point. A given source point may go to multiple +destination points, but no destination point will receive input from more +than one source point.

+
+ +
+
+NEAREST_DTOS = <RegridMethod.NEAREST_DTOS: 4>
+

In this version of nearest neighbor interpolation each source point is +mapped to the closest destination point. A given destination point may +receive input from multiple source points, but no source point will go to +more than one destination point.

+
+ +
+
+CONSERVE_2ND = <RegridMethod.CONSERVE_2ND: 5>
+

Second-order conservative interpolation. This method’s main purpose is to +preserve the integral of the field across the interpolation from source to +destination. The difference between the first and second-order conservative +methods is that the second-order takes the source gradient into account, so +it yields a smoother destination field that typically better matches the +source field. This difference between the first and second-order methods is +particularly apparent when going from a coarse source grid to a finer +destination grid. Another difference is that the second-order method does +not guarantee that after regridding the range of values in the destination +field is within the range of values in the source field. For example, if the +mininum value in the source field is 0.0, then it’s possible that after +regridding with the second-order method, the destination field will contain +values less than 0.0. This method requires corner coordinate values to be +provided in the Grid. It currently only works for +Fields <esmpy.api.field.Field>`s created on the +:class:`~esmpy.api.grid.Grid center stagger or +the Mesh element location.

+
+ +
+ +
+ + +
+
+
+
+ +
+
+ + + + \ No newline at end of file diff --git a/docs/nightly/fix/reconcile-info/html/StaggerLoc.html b/docs/nightly/fix/reconcile-info/html/StaggerLoc.html new file mode 100644 index 00000000..150d959a --- /dev/null +++ b/docs/nightly/fix/reconcile-info/html/StaggerLoc.html @@ -0,0 +1,219 @@ + + + + + + + + StaggerLoc — ESMPy 8.8.0b0 documentation + + + + + + + + + + + + + + +
+
+
+
+ +
+

StaggerLoc

+
+
+class esmpy.api.constants.StaggerLoc(value, names=None, module=None, type=None, start=1)
+

In the Grid class, data can be located at different positions in a +Grid cell. When setting or retrieving coordinate data the stagger +location is specified to tell the Grid method from where in the +cell to get the data.

+
+
+CENTER = <StaggerLoc.CENTER: 0>
+

2D: Cell centered stagger location.

+
+ +
+
+EDGE1 = <StaggerLoc.EDGE1: 1>
+

2D: First dimension edge stagger location.

+
+ +
+
+EDGE2 = <StaggerLoc.EDGE2: 2>
+

2D: Second dimension edge stagger location.

+
+ +
+
+CORNER = <StaggerLoc.CORNER: 3>
+

2D: Cell corner stagger location.

+
+ +
+
+CENTER_VCENTER = <StaggerLoc.CENTER: 0>
+

3D: Vertically centered stagger location.

+
+ +
+
+EDGE1_VCENTER = <StaggerLoc.EDGE1: 1>
+

3D: Vertically centered first dimension edge stagger location.

+
+ +
+
+EDGE2_VCENTER = <StaggerLoc.EDGE2: 2>
+

3D: Vertically centered second dimension edge stagger location.

+
+ +
+
+CORNER_VCENTER = <StaggerLoc.CORNER: 3>
+

3D: Vertically centered corner stagger location.

+
+ +
+
+CENTER_VFACE = <StaggerLoc.CENTER_VFACE: 4>
+

3D: Centered stagger location of the top and bottom cell faces.

+
+ +
+
+EDGE1_VFACE = <StaggerLoc.EDGE1_VFACE: 5>
+

3D: First dimension edge stagger location of the top and bottom cell faces.

+
+ +
+
+EDGE2_VFACE = <StaggerLoc.EDGE2_VFACE: 6>
+

3D: Second dimension edge stagger location of the top and bottom cell faces.

+
+ +
+
+CORNER_VFACE = <StaggerLoc.CORNER_VFACE: 7>
+

3D: Corner stagger location of the top and bottom cell faces.

+
+ +
+ +
+ + +
+
+
+
+ +
+
+ + + + \ No newline at end of file diff --git a/docs/nightly/fix/reconcile-info/html/TypeKind.html b/docs/nightly/fix/reconcile-info/html/TypeKind.html new file mode 100644 index 00000000..8349324e --- /dev/null +++ b/docs/nightly/fix/reconcile-info/html/TypeKind.html @@ -0,0 +1,161 @@ + + + + + + + + TypeKind — ESMPy 8.8.0b0 documentation + + + + + + + + + + + + + + +
+
+
+
+ +
+

TypeKind

+
+
+class esmpy.api.constants.TypeKind(value, names=None, module=None, type=None, start=1)
+

This is used to indicate the type and kind of ESMPy types to the +underlying ESMF library routines.

+
+
+I4 = <TypeKind.I4: 3>
+

A four byte integer, equivalent to numpy.int32.

+
+ +
+
+I8 = <TypeKind.I8: 4>
+

An eight byte integer, equivalent to numpy.int64.

+
+ +
+
+R4 = <TypeKind.R4: 5>
+

A four byte real, equivalent to numpy.float32.

+
+ +
+
+R8 = <TypeKind.R8: 6>
+

An eight byte real, equivalent to numpy.float64.

+
+ +
+ +
+ + +
+
+
+
+ +
+
+ + + + \ No newline at end of file diff --git a/docs/nightly/fix/reconcile-info/html/UnmappedAction.html b/docs/nightly/fix/reconcile-info/html/UnmappedAction.html new file mode 100644 index 00000000..7ae3602d --- /dev/null +++ b/docs/nightly/fix/reconcile-info/html/UnmappedAction.html @@ -0,0 +1,136 @@ + + + + + + + + UnmappedAction — ESMPy 8.8.0b0 documentation + + + + + + + + + + + + + +
+
+
+
+ +
+

UnmappedAction

+
+
+class esmpy.api.constants.UnmappedAction(value, names=None, module=None, type=None, start=1)
+

This is used to indicate what action to take with respect to unmapped destination +points and the entries of the sparse matrix that correspond to +these points.

+
+
+ERROR = <UnmappedAction.ERROR: 0>
+

Unmapped points result in an error code return.

+
+ +
+
+IGNORE = <UnmappedAction.IGNORE: 1>
+

Unmapped points are ignored.

+
+ +
+ +
+ + +
+
+
+
+ +
+
+ + + + \ No newline at end of file diff --git a/docs/nightly/fix/reconcile-info/html/_sources/CoordSys.rst.txt b/docs/nightly/fix/reconcile-info/html/_sources/CoordSys.rst.txt new file mode 100644 index 00000000..c60b52ca --- /dev/null +++ b/docs/nightly/fix/reconcile-info/html/_sources/CoordSys.rst.txt @@ -0,0 +1,7 @@ +~~~~~~~~ +CoordSys +~~~~~~~~ + +.. autoclass:: esmpy.api.constants.CoordSys + :members: + :exclude-members: __new__ diff --git a/docs/nightly/fix/reconcile-info/html/_sources/ExtrapMethod.rst.txt b/docs/nightly/fix/reconcile-info/html/_sources/ExtrapMethod.rst.txt new file mode 100644 index 00000000..203eb2e6 --- /dev/null +++ b/docs/nightly/fix/reconcile-info/html/_sources/ExtrapMethod.rst.txt @@ -0,0 +1,7 @@ +~~~~~~~~~~~~ +ExtrapMethod +~~~~~~~~~~~~ + +.. autoclass:: esmpy.api.constants.ExtrapMethod + :members: + :exclude-members: __new__ diff --git a/docs/nightly/fix/reconcile-info/html/_sources/FileFormat.rst.txt b/docs/nightly/fix/reconcile-info/html/_sources/FileFormat.rst.txt new file mode 100644 index 00000000..0d7c5864 --- /dev/null +++ b/docs/nightly/fix/reconcile-info/html/_sources/FileFormat.rst.txt @@ -0,0 +1,7 @@ +~~~~~~~~~~ +FileFormat +~~~~~~~~~~ + +.. autoclass:: esmpy.api.constants.FileFormat + :members: + :exclude-members: __new__ diff --git a/docs/nightly/fix/reconcile-info/html/_sources/FileMode.rst.txt b/docs/nightly/fix/reconcile-info/html/_sources/FileMode.rst.txt new file mode 100644 index 00000000..1d2ec75a --- /dev/null +++ b/docs/nightly/fix/reconcile-info/html/_sources/FileMode.rst.txt @@ -0,0 +1,7 @@ +~~~~~~~~ +FileMode +~~~~~~~~ + +.. autoclass:: esmpy.api.constants.FileMode + :members: + :exclude-members: __new__ diff --git a/docs/nightly/fix/reconcile-info/html/_sources/GridItem.rst.txt b/docs/nightly/fix/reconcile-info/html/_sources/GridItem.rst.txt new file mode 100644 index 00000000..dcb838c5 --- /dev/null +++ b/docs/nightly/fix/reconcile-info/html/_sources/GridItem.rst.txt @@ -0,0 +1,7 @@ +~~~~~~~~ +GridItem +~~~~~~~~ + +.. autoclass:: esmpy.api.constants.GridItem + :members: + :exclude-members: __new__ \ No newline at end of file diff --git a/docs/nightly/fix/reconcile-info/html/_sources/LineType.rst.txt b/docs/nightly/fix/reconcile-info/html/_sources/LineType.rst.txt new file mode 100644 index 00000000..11cd6845 --- /dev/null +++ b/docs/nightly/fix/reconcile-info/html/_sources/LineType.rst.txt @@ -0,0 +1,7 @@ +~~~~~~~~ +LineType +~~~~~~~~ + +.. autoclass:: esmpy.api.constants.LineType + :members: + :exclude-members: __new__ \ No newline at end of file diff --git a/docs/nightly/fix/reconcile-info/html/_sources/LogKind.rst.txt b/docs/nightly/fix/reconcile-info/html/_sources/LogKind.rst.txt new file mode 100644 index 00000000..721ef175 --- /dev/null +++ b/docs/nightly/fix/reconcile-info/html/_sources/LogKind.rst.txt @@ -0,0 +1,7 @@ +~~~~~~~ +LogKind +~~~~~~~ + +.. autoclass:: esmpy.api.constants.LogKind + :members: + :exclude-members: __new__ \ No newline at end of file diff --git a/docs/nightly/fix/reconcile-info/html/_sources/MeshElemType.rst.txt b/docs/nightly/fix/reconcile-info/html/_sources/MeshElemType.rst.txt new file mode 100644 index 00000000..34357fe1 --- /dev/null +++ b/docs/nightly/fix/reconcile-info/html/_sources/MeshElemType.rst.txt @@ -0,0 +1,7 @@ +~~~~~~~~~~~~ +MeshElemType +~~~~~~~~~~~~ + +.. autoclass:: esmpy.api.constants.MeshElemType + :members: + :exclude-members: __new__ \ No newline at end of file diff --git a/docs/nightly/fix/reconcile-info/html/_sources/MeshLoc.rst.txt b/docs/nightly/fix/reconcile-info/html/_sources/MeshLoc.rst.txt new file mode 100644 index 00000000..888c3672 --- /dev/null +++ b/docs/nightly/fix/reconcile-info/html/_sources/MeshLoc.rst.txt @@ -0,0 +1,7 @@ +~~~~~~~ +MeshLoc +~~~~~~~ + +.. autoclass:: esmpy.api.constants.MeshLoc + :members: + :exclude-members: __new__ \ No newline at end of file diff --git a/docs/nightly/fix/reconcile-info/html/_sources/NormType.rst.txt b/docs/nightly/fix/reconcile-info/html/_sources/NormType.rst.txt new file mode 100644 index 00000000..d4b6cbaa --- /dev/null +++ b/docs/nightly/fix/reconcile-info/html/_sources/NormType.rst.txt @@ -0,0 +1,7 @@ +~~~~~~~~ +NormType +~~~~~~~~ + +.. autoclass:: esmpy.api.constants.NormType + :members: + :exclude-members: __new__ \ No newline at end of file diff --git a/docs/nightly/fix/reconcile-info/html/_sources/PoleKind.rst.txt b/docs/nightly/fix/reconcile-info/html/_sources/PoleKind.rst.txt new file mode 100644 index 00000000..590cc25d --- /dev/null +++ b/docs/nightly/fix/reconcile-info/html/_sources/PoleKind.rst.txt @@ -0,0 +1,7 @@ +~~~~~~~~ +PoleKind +~~~~~~~~ + +.. autoclass:: esmpy.api.constants.PoleKind + :members: + :exclude-members: __new__ \ No newline at end of file diff --git a/docs/nightly/fix/reconcile-info/html/_sources/PoleMethod.rst.txt b/docs/nightly/fix/reconcile-info/html/_sources/PoleMethod.rst.txt new file mode 100644 index 00000000..6d59b56e --- /dev/null +++ b/docs/nightly/fix/reconcile-info/html/_sources/PoleMethod.rst.txt @@ -0,0 +1,7 @@ +~~~~~~~~~~ +PoleMethod +~~~~~~~~~~ + +.. autoclass:: esmpy.api.constants.PoleMethod + :members: + :exclude-members: __new__ \ No newline at end of file diff --git a/docs/nightly/fix/reconcile-info/html/_sources/Region.rst.txt b/docs/nightly/fix/reconcile-info/html/_sources/Region.rst.txt new file mode 100644 index 00000000..b905f434 --- /dev/null +++ b/docs/nightly/fix/reconcile-info/html/_sources/Region.rst.txt @@ -0,0 +1,7 @@ +~~~~~~ +Region +~~~~~~ + +.. autoclass:: esmpy.api.constants.Region + :members: + :exclude-members: __new__ \ No newline at end of file diff --git a/docs/nightly/fix/reconcile-info/html/_sources/RegridMethod.rst.txt b/docs/nightly/fix/reconcile-info/html/_sources/RegridMethod.rst.txt new file mode 100644 index 00000000..fc2e5027 --- /dev/null +++ b/docs/nightly/fix/reconcile-info/html/_sources/RegridMethod.rst.txt @@ -0,0 +1,7 @@ +~~~~~~~~~~~~ +RegridMethod +~~~~~~~~~~~~ + +.. autoclass:: esmpy.api.constants.RegridMethod + :members: + :exclude-members: __new__ \ No newline at end of file diff --git a/docs/nightly/fix/reconcile-info/html/_sources/StaggerLoc.rst.txt b/docs/nightly/fix/reconcile-info/html/_sources/StaggerLoc.rst.txt new file mode 100644 index 00000000..7eac7ae4 --- /dev/null +++ b/docs/nightly/fix/reconcile-info/html/_sources/StaggerLoc.rst.txt @@ -0,0 +1,7 @@ +~~~~~~~~~~ +StaggerLoc +~~~~~~~~~~ + +.. autoclass:: esmpy.api.constants.StaggerLoc + :members: + :exclude-members: __new__ \ No newline at end of file diff --git a/docs/nightly/fix/reconcile-info/html/_sources/TypeKind.rst.txt b/docs/nightly/fix/reconcile-info/html/_sources/TypeKind.rst.txt new file mode 100644 index 00000000..378973d3 --- /dev/null +++ b/docs/nightly/fix/reconcile-info/html/_sources/TypeKind.rst.txt @@ -0,0 +1,7 @@ +~~~~~~~~ +TypeKind +~~~~~~~~ + +.. autoclass:: esmpy.api.constants.TypeKind + :members: + :exclude-members: __new__ \ No newline at end of file diff --git a/docs/nightly/fix/reconcile-info/html/_sources/UnmappedAction.rst.txt b/docs/nightly/fix/reconcile-info/html/_sources/UnmappedAction.rst.txt new file mode 100644 index 00000000..c09ffaf6 --- /dev/null +++ b/docs/nightly/fix/reconcile-info/html/_sources/UnmappedAction.rst.txt @@ -0,0 +1,7 @@ +~~~~~~~~~~~~~~ +UnmappedAction +~~~~~~~~~~~~~~ + +.. autoclass:: esmpy.api.constants.UnmappedAction + :members: + :exclude-members: __new__ \ No newline at end of file diff --git a/docs/nightly/fix/reconcile-info/html/_sources/api.rst.txt b/docs/nightly/fix/reconcile-info/html/_sources/api.rst.txt new file mode 100644 index 00000000..d10194e6 --- /dev/null +++ b/docs/nightly/fix/reconcile-info/html/_sources/api.rst.txt @@ -0,0 +1,954 @@ +========== +API +========== + +------- +Classes +------- + +ESMPy uses a :class:`~esmpy.api.field.Field` object to represent data variables +built on an underlying spatial discretization, which is represented by a +:class:`~esmpy.api.grid.Grid`, :class:`~esmpy.api.mesh.Mesh` or +:class:`~esmpy.api.locstream.LocStream`. +Regridding between :class:`Fields ` is accomplished with the +:class:`~esmpy.api.regrid.Regrid` class. All of these classes are explained in +more detail in the sections provided by the links in the following table. + +========================================= ============================================================================== +Class Description +========================================= ============================================================================== +:class:`~esmpy.api.esmpymanager.Manager` A manager class to initialize and finalize ESMF +:class:`~esmpy.api.field.Field` A data field built on a :class:`~esmpy.api.grid.Grid`, :class:`~esmpy.api.mesh.Mesh`, or :class:`~esmpy.api.locstream.LocStream` +:class:`~esmpy.api.grid.Grid` A class to represent a logically rectangular grid +:class:`~esmpy.api.mesh.Mesh` A class to represent an unstructured grid +:class:`~esmpy.api.locstream.LocStream` A class to represent observational data as a collection of disconnected points +:class:`~esmpy.api.regrid.Regrid` The regridding utility +:class:`~esmpy.api.regrid.RegridFromFile` The from file regridding utility +========================================= ============================================================================== + + +--------------- +Named Constants +--------------- + +ESMPy follows the ESMF convention of using "named constants" to represent the +available options for parameters that expect a variety of specific inputs. The +following table lists the available named constants and provides links to pages +that further explain the available values. + +============================================================ ============================== +Named constants Description +============================================================ ============================== +:class:`CoordSys` Specify the coordinate system of a :class:`~esmpy.api.grid.Grid` +:class:`ExtrapMethod` Specify the extrapolation method +:class:`FileFormat` Specify the format of a data file +:class:`FileMode` Specify the mode of a data file +:class:`GridItem` Specify a mask or area item on a :class:`~esmpy.api.grid.Grid` +:class:`LineType` Specify the type of line that connects two points on a sphere +:class:`LogKind` Specify how much logging should be done +:class:`MeshElemType` Specify the type of the :class:`~esmpy.api.mesh.Mesh` elements +:class:`MeshLoc` Specify a nodal or elemental :class:`~esmpy.api.mesh.Mesh` +:class:`NormType` Specify the type of normalization to use for conservative regridding weights +:class:`PoleKind` Specify the type of connection that appears at the poles of the :class:`~esmpy.api.grid.Grid` +:class:`PoleMethod` Specify which type of artificial pole to construct on the source :class:`~esmpy.api.grid.Grid` for regridding +:class:`Region` Specify various regions in the data layout of +:class:`RegridMethod` Specify which interpolation method to use regridding +:class:`StaggerLoc` Specify the position for data in a :class:`~esmpy.api.grid.Grid` cell +:class:`TypeKind` Specify the type and kind of data +:class:`UnmappedAction` Specify which action to take with respect to unmapped destination points +============================================================ ============================== + +------- +Manager +------- + +The :class:`~esmpy.api.esmpymanager.Manager` is used by ESMPy to simplify a +number of low-level calls used by the underlying ESMF framework to allocate +resources, enable logging, and control garbage collection. + +~~~~~~~~~~~~~~~~~~~ +Resource Allocation +~~~~~~~~~~~~~~~~~~~ + +The ESMF Virtual Machine (VM) +is created at the beginning of each ESMPy execution, and contains information +about the topology and characteristics of the underlying computer. The VM +allocates computational resources in the form of +**Persistent Execution Threads**, or **PETs**. These are equivalent to operating +system threads with a lifetime of at least that of the ESMPy execution. In the +simplest, and most common case, a PET is equivalent to an MPI process. The +number of PETs and the current PET can be queried from the +:class:`~esmpy.api.esmpymanager.Manager`: + +.. code:: + + mg = esmpy.Manager() + pet_count = mg.pet_count() + local_pet = mg.local_pet() + +Refer to the VM Class of the +`ESMF Reference Manual `_ +for more information. + +~~~~~~~ +Logging +~~~~~~~ + +The :class:`~esmpy.api.esmpymanager.Manager` is also used to enable logging: + +.. code:: + + mg = esmpy.Manager(debug=True) + local_pet = mg.local_pet + +The output will be logged in files named PET.ESMF_LogFile. + +~~~~~~~~~~~~~~~~~ +Memory management +~~~~~~~~~~~~~~~~~ + +The underlying ESMF framework needs to be initialized and finalized once and +only once per execution. This is handled internally by the +:class:`~esmpy.api.esmpymanager.Manager` and **does not** require any explicit +user intervention. However, the ESMF garbage collection feature is not triggered +until the finalization routine is invoked, which may not happen until the +:class:`~esmpy.api.esmpymanager.Manager` goes out of scope at the end of the +program execution. + +If memory deallocation of ESMPy +objects is required *prior* to the end of the program, the class level +``destroy`` routines should be invoked: + +.. code:: + + mg = esmpy.Manager() + + mg.destroy() + +This is commonly required when reusing a :class:`~esmpy.api.regrid.Regrid` object +to interpolate data between many :class:`~esmpy.api.field.Field` pairs. + +~~~~~~~~~~~~~~~~~ +MOAB Mesh backend +~~~~~~~~~~~~~~~~~ + +The Manager can be used to enable the `MOAB `_ +mesh backend to the Mesh. + +.. code:: + + mg.set_moab(moab_on=True) + +The MOAB mesh is an alternative to the native ESMF mesh, and does not yet have +full support. + +------------------------------ +Spatial Discretization Objects +------------------------------ + +There are three different objects used for spatial coordinate representation: +:class:`~esmpy.api.grid.Grid`, :class:`~esmpy.api.mesh.Mesh`, and :class:`~esmpy.api.locstream.LocStream`. :class:`Grids ` are used to represent logically rectangular +grids, :class:`Meshes ` are used for unstructured collections of polygons, and +:class:`LocStreams ` are used for unstructured collections of individual points. These +objects are nearly identical counterparts to the objects of the same name in +ESMF, with some simplifications for ease of use in the Python environment. + +~~~~ +Grid +~~~~ + +The :class:`~esmpy.api.grid.Grid` is used to represent the geometry and discretization of logically +rectangular physical grids. The :class:`~esmpy.api.grid.Grid` can also hold information that can used in +calculations involving the :class:`~esmpy.api.grid.Grid`, like a mask or the cell areas. Refer to the Grid Class of the +`ESMF Reference Manual `_ for more information. + +++++++++++ +Staggering +++++++++++ + +Staggering is a finite difference technique in which the values of different +physical quantities are placed at different locations within a grid cell. + +The ESMF :class:`~esmpy.api.grid.Grid` class supports a variety of stagger locations, including cell +centers, corners, and edge centers. The default stagger location in ESMF is the +cell center, and cell counts in :class:`~esmpy.api.grid.Grid` are based on this assumption. Combinations +of the 2D ESMF stagger locations are sufficient to specify any of the Arakawa +staggers. ESMF also supports staggering in 3D and higher dimensions. There are +shortcuts for standard staggers, and interfaces through which users can create +custom staggers. + +As a default the ESMF :class:`~esmpy.api.grid.Grid` class provides symmetric staggering, so that cell +centers are enclosed by cell perimeter (e.g. corner) stagger locations. This +means the coordinate arrays for stagger locations other than the center will +have an additional element of padding in order to enclose the cell center +locations. However, to achieve other types of staggering, the user may alter or +eliminate this padding by using the appropriate options when adding coordinates +to a :class:`~esmpy.api.grid.Grid`. + +:class:`~esmpy.api.grid.Grid` staggers are indicated using +:class:`StaggerLoc`. + +.. code:: + + grid = esmpy.Grid(np.array([3,4]), staggerloc=esmpy.StaggerLoc.CENTER) + ++++++++++++++++++++++ +Spherical Coordinates ++++++++++++++++++++++ + +In the case that the :class:`~esmpy.api.grid.Grid` is on a sphere (coord_sys = :class:`esmpy.api.constants.CoordSys.SPH_DEG` or +:class:`esmpy.api.constants.CoordSys.SPH_RAD`) then the coordinates given in the :class:`~esmpy.api.grid.Grid` are interpreted +as latitude and longitude values. The coordinates can either be in degrees or +radians as indicated by the ``coord_sys`` flag set during :class:`~esmpy.api.grid.Grid` creation. As is +true with many global models, this application currently assumes the latitude +and longitude refer to positions on a perfect sphere. + +The :class:`~esmpy.api.grid.Grid` coordinate system is represented using +:class:`CoordSys`. + +.. code:: + + grid = esmpy.Grid(np.array([3,4]), staggerloc=esmpy.StaggerLoc.CENTER, + coord_sys=esmpy.CoordSys.SPH_DEG) + ++++++++++++ +Periodicity ++++++++++++ + +A periodic connection can be specified when building :class:`Grids ` in spherical +coordinates. The ``num_peri_dims`` parameter indicates the total number of +periodic dimensions and ``periodic_dim`` is used to identify which dimensions +should be considered periodic. There must always be at least one non-periodic +dimension. For example, to create a global latitude-longitude :class:`~esmpy.api.grid.Grid` there would +be one periodic dimension, dimension 0 (longitude). + +.. code:: + + grid = esmpy.Grid(np.array([3,4]), staggerloc=esmpy.StaggerLoc.CENTER, + coord_sys=esmpy.CoordSys.SPH_DEG, + num_peri_dims=1, periodic_dim=0) + ++++++++++++++++ +Pole Generation ++++++++++++++++ + +The :class:`~esmpy.api.grid.Grid` can generate an artificial pole by using the ``pole_dim`` parameter. This +can be helpful for regridding operations to smooth out the interpolated values +in the polar region. For the example of creating a global latitude-longitude +:class:`~esmpy.api.grid.Grid`, the pole dimension would be 1 (latitude). + +.. code:: + + grid = esmpy.Grid(np.array([3,4]), staggerloc=esmpy.StaggerLoc.CENTER, + coord_sys=esmpy.CoordSys.SPH_DEG, + num_peri_dims=1, periodic_dim=0, pole_dim=1) + ++++++++ +Masking ++++++++ + +Masking is the process used to mark parts of a :class:`~esmpy.api.grid.Grid` to be ignored during an +operation. Marking :class:`~esmpy.api.grid.Grid` cells as masked can affect the :class:`~esmpy.api.field.Field` values that are +represented by those cells. Masking is specified by assigning an integer value +to a :class:`~esmpy.api.grid.Grid` cell. This allows many different masks to be defined on the same :class:`~esmpy.api.grid.Grid`, +any combination of which may be also activated on the :class:`~esmpy.api.field.Field` by specifying the +corresponding integer values. The activation of :class:`~esmpy.api.field.Field` masks with respect to the +underlying :class:`~esmpy.api.grid.Grid` mask is handled by :class:`~esmpy.api.regrid.Regrid`, and a more +general discussion of masking is covered in the :ref:`masking ` +section. + +.. code:: + + In [1]: import numpy as np + ...: import esmpy + ...: grid = esmpy.Grid(np.array([3,4]), staggerloc=esmpy.StaggerLoc.CENTER, + ...: coord_sys=esmpy.CoordSys.SPH_DEG, + ...: num_peri_dims=1, periodic_dim=0, pole_dim=1) + ...: + ...: mask = grid.add_item(esmpy.GridItem.MASK, staggerloc=esmpy.StaggerLoc.CENTER) + ...: mask + ...: + Out[1]: + array([[1, 1, 1, 1], + [1, 1, 1, 1], + [1, 1, 1, 1]], dtype=int32) + +++++++++++ +Cell Areas +++++++++++ + +:class:`~esmpy.api.grid.Grid` cell areas can be calculated by ESMPy. Space must first be allocated for +this calculation by adding an +:class:`~esmpy.api.constants.GridItem.AREA` item to the :class:`~esmpy.api.grid.Grid`. +Then a :class:`~esmpy.api.field.Field` must be created, and the +:class:`~esmpy.api.field.Field.get_area()` function called. + +.. Note:: The :class:`~esmpy.api.grid.Grid` area calculation assumes the :class:`~esmpy.api.grid.Grid` is a unit sphere. + +:class:`~esmpy.api.grid.Grid` cell areas may also be set to user-defined values +after the :class:`~esmpy.api.constants.GridItem.AREA` item has +been allocated and retrieved using :class:`~esmpy.api.grid.Grid.get_item()`. + +.. code:: + + In [1]: grid = esmpy.Grid(np.array([3,4]), staggerloc=[esmpy.StaggerLoc.CENTER, esmpy.StaggerLoc.CORNER], + ...: coord_sys=esmpy.CoordSys.SPH_DEG, + ...: num_peri_dims=1, periodic_dim=0, pole_dim=1) + ...: + ...: + ...: gridLon = grid.get_coords(0) + ...: gridLat = grid.get_coords(1) + ...: gridLonCorner = grid.get_coords(0, staggerloc=esmpy.StaggerLoc.CORNER) + ...: gridLatCorner = grid.get_coords(1, staggerloc=esmpy.StaggerLoc.CORNER) + ...: + ...: lon = np.linspace(-120,120,3) + ...: lat = np.linspace(-67.5, 67.5,4) + ...: lon_corner = np.arange(-180,180,120) + ...: lat_corner = np.linspace(-90, 90, 5) + ...: + ...: lonm, latm = np.meshgrid(lon, lat, indexing='ij') + ...: lonm_corner, latm_corner = np.meshgrid(lon_corner, lat_corner, indexing='ij') + ...: + ...: gridLon[:] = lonm + ...: gridLat[:] = latm + ...: gridLonCorner[:] = lonm_corner + ...: gridLatCorner[:] = latm_corner + ...: + ...: field = esmpy.Field(grid) + ...: field.get_area() + ...: field.data + ...: + Out[1]: + array([[ 0.32224085, 1.02707409, 1.02707409, 0.32224085], + [ 0.32224085, 1.02707409, 1.02707409, 0.32224085], + [ 0.32224085, 1.02707409, 1.02707409, 0.32224085]]) + +~~~~ +Mesh +~~~~ + +A :class:`~esmpy.api.mesh.Mesh` is an object for representing unstructured grids. +Refer to the Mesh Class of the +`ESMF Reference Manual `_ +for more information. + +A :class:`~esmpy.api.mesh.Mesh` is constructed of *nodes* and *elements*. A node, also known as a vertex +or corner, is a part of a :class:`~esmpy.api.mesh.Mesh` which represents a single point. An element, +also known as a cell, is a part of a :class:`~esmpy.api.mesh.Mesh` which represents a small +region of space. Elements are described in terms of a connected set of nodes +which represent locations along their boundaries. + +:class:`~esmpy.api.field.Field` data may be located on either the nodes or elements of a :class:`~esmpy.api.mesh.Mesh`. :class:`Fields ` +created on a :class:`~esmpy.api.mesh.Mesh` can also be used as either the source or destination or both +of a regridding operation. + +The dimension of a :class:`~esmpy.api.mesh.Mesh` in ESMF is specified with two parameters: the +*parametric* dimension and the *spatial* dimension. + +The parametric dimension of a :class:`~esmpy.api.mesh.Mesh` is the dimension of the topology of the :class:`~esmpy.api.mesh.Mesh`. +This can be thought of as the dimension of the elements which make up the :class:`~esmpy.api.mesh.Mesh`. +For example, a :class:`~esmpy.api.mesh.Mesh` composed of triangles would have a parametric dimension of +2, and a :class:`~esmpy.api.mesh.Mesh` composed of tetrahedra would have a parametric dimension of 3. + +The spatial dimension of a :class:`~esmpy.api.mesh.Mesh` is the dimension of the space in which the :class:`~esmpy.api.mesh.Mesh` +is embedded. In other words, it is the number of coordinate dimensions needed to +describe the location of the nodes making up the :class:`~esmpy.api.mesh.Mesh`. + +For example, a :class:`~esmpy.api.mesh.Mesh` constructed of squares on a plane would have a parametric +dimension of 2 and a spatial dimension of 2. If that same :class:`~esmpy.api.mesh.Mesh` were used to +represent the 2D surface of a sphere, then the :class:`~esmpy.api.mesh.Mesh` would still have a +parametric dimension of 2, but now its spatial dimension would be 3. + +Only :class:`Meshes ` whose number of coordinate dimensions (spatial dimension) is 2 or 3 +are supported. The dimension of the elements in a :class:`~esmpy.api.mesh.Mesh` (parametric dimension) must +be less than or equal to the spatial dimension, but also must be either 2 or 3. +This means that a :class:`~esmpy.api.mesh.Mesh` may be either 2D elements in 2D space, 3D elements in 3D +space, or a manifold constructed of 2D elements embedded in 3D space. + +For a parametric dimension of 2, the native supported element types are +triangles and quadrilaterals. In addition to these, ESMF supports 2D polygons +with any number of sides. Internally these are represented as sets of triangles, +but to the user should behave like any other element. For a parametric dimension +of 3, the supported element types are tetrahedrons and hexahedrons. The :class:`~esmpy.api.mesh.Mesh` +supports any combination of element types within a particular dimension, but +types from different dimensions may not be mixed. For example, a :class:`~esmpy.api.mesh.Mesh` cannot be +constructed of both quadrilaterals and tetrahedra. + ++++++++++++++ +Mesh Creation ++++++++++++++ + +To create a :class:`~esmpy.api.mesh.Mesh` we need to set some properties of the :class:`~esmpy.api.mesh.Mesh` as a whole, some +properties of each node in the :class:`~esmpy.api.mesh.Mesh` and then some properties of each element +which connects the nodes. + +For the :class:`~esmpy.api.mesh.Mesh` as a whole we set its parametric dimension and spatial dimension. +A :class:`Mesh's ` parametric dimension can be thought of as the dimension of the elements +which make up the :class:`~esmpy.api.mesh.Mesh`. A :class:`Mesh's ` spatial dimension, on the other hand, is the +number of coordinate dimensions needed to describe the location of the nodes +making up the :class:`~esmpy.api.mesh.Mesh`. + +The structure of the per node and element information used to create a :class:`~esmpy.api.mesh.Mesh` is +influenced by the :class:`~esmpy.api.mesh.Mesh` distribution strategy. The :class:`~esmpy.api.mesh.Mesh` class is distributed by +elements. This means that a node must be present on any PET that contains +an element associated with that node, but not on any other PET (a node +can't be on a PET without an element "home"). Since a node may be used by +two or more elements located on different PETs, a node may be duplicated +on multiple PETs. When a node is duplicated in this manner, one and only +one of the PETs that contain the node must "own" the node. The user sets +this ownership when they define the nodes during :class:`~esmpy.api.mesh.Mesh` +creation. When a :class:`~esmpy.api.field.Field` is created on a +:class:`~esmpy.api.mesh.Mesh` (i.e. on the :class:`~esmpy.api.mesh.Mesh` nodes), +on each PET the :class:`~esmpy.api.field.Field` is only +created on the nodes which are owned by that PET. This means that the size +of the :class:`~esmpy.api.field.Field` memory on the PET can be smaller than the +number of nodes used to create the :class:`~esmpy.api.mesh.Mesh` on that PET. + +Three properties need to be defined for each :class:`~esmpy.api.mesh.Mesh` node: the global id of the node +(``node_ids``), node coordinates (``node_coords``), and which PET owns the node +(``node_owners``). The node id is a unique (across all PETs) integer attached +to the particular node. It is used to indicate which nodes are the same when +connecting together pieces of the :class:`~esmpy.api.mesh.Mesh` on different PETs. The node +coordinates indicate the location of a node in space and are used in the :class:`~esmpy.api.regrid.Regrid` +functionality when interpolating. The node owner indicates which PET is in +charge of the node. This is used when creating a :class:`~esmpy.api.field.Field` on the :class:`~esmpy.api.mesh.Mesh` to indicate +which PET should contain a :class:`~esmpy.api.field.Field` location for the data. + +Three properties need to be defined for each :class:`~esmpy.api.mesh.Mesh` element: the global id of the +element (``element_ids``), the topology type of the element (``element_types``), and +which nodes are connected together to form the element (``element_conn``). The +element id is a unique (across all PETs) integer attached to the +particular element. The element type describes the topology of the element +(e.g. a triangle vs. a quadrilateral). The range of choices for the topology of +the elements in a :class:`~esmpy.api.mesh.Mesh` are restricted by the :class:`Mesh's ` parametric dimension (e.g. a +:class:`~esmpy.api.mesh.Mesh` can't contain a 2D element like a triangle, when its parametric dimension +is 3D), but it can contain any combination of elements appropriate to its +dimension. In particular, in 2D ESMF supports two native element types triangle +and quadrilateral, but also provides support for polygons with any number of +sides. These polygons are represented internally as sets of triangles, but to +the user should behave like other elements. To specify a polygon with more than +four sides, the element type should be set to the number of corners of the +polygon (e.g. element type=6 for a hexagon). The element connectivity indicates +which nodes are to be connected together to form the element. The number of +nodes connected together for each element is implied by the elements topology +type (``element_types``). It is IMPORTANT to note, that the entries in this list are +NOT the global ids of the nodes, but are indices into the PET local lists +of node info used in the :class:`~esmpy.api.mesh.Mesh` creation. In other words, the element connectivity +isn't specified in terms of the global list of nodes, but instead is specified +in terms of the locally described node info. One other important point about +connectivities is that the order of the nodes in the connectivity list of an +element is important. In general, when specifying an element with parametric +dimension 2, the nodes should be given in counterclockwise order around the +element. + +The three step :class:`~esmpy.api.mesh.Mesh` creation process starts with a call to the :class:`~esmpy.api.mesh.Mesh` constructor. +It is then followed by the :class:`~esmpy.api.mesh.Mesh.add_nodes()` call to +specify nodes, and then the :class:`~esmpy.api.mesh.Mesh.add_elements()` call to +specify elements. + +.. code:: + + # 2.5 8 10 --------11 + # / \ / | + # 2.1 7 9 12 + # | | 5 / + # | 4 | / + # | | / + # 1.0 4 ------- 5 ------- 6 + # | | \ 3 | + # | 1 | \ | + # | | 2 \ | + # -0.1 1 ------- 2 ------- 3 + # + # -0.1 1.0 2.1 2.5 + # + # Node Ids at corners + # Element Ids in centers + + # Two parametric dimensions, and two spatial dimensions + mesh = esmpy.Mesh(parametric_dim=2, spatial_dim=2, coord_sys=coord_sys) + + num_node = 12 + num_elem = 5 + nodeId = np.array([1,2,3,4,5,6,7,8,9,10,11,12]) + nodeCoord = np.array([-0.1,-0.1, #node id 1 + 1.0,-0.1, #node id 2 + 2.1,-0.1, #node id 3 + 0.1, 1.0, #node id 4 + 1.0, 1.0, #node id 5 + 2.1, 1.0, #node id 6 + 0.1, 2.1, #node id 7 + 0.5, 2.5, #node id 8 + 1.0, 2.1, #node id 9 + 1.5, 2.5, #node id 10 + 2.5, 2.5, #node id 11 + 2.5, 2.1]) #node id 12 + + + nodeOwner = np.zeros(num_node) + + elemId = np.array([1,2,3,4,5]) + elemType=np.array([esmpy.MeshElemType.QUAD, + esmpy.MeshElemType.TRI, + esmpy.MeshElemType.TRI, 5, 6]) + + elemConn=np.array([0,1,4,3, # elem id 1 + 1,2,4, # elem id 2 + 2,5,4, # elem id 3 + 3,4,8,7,6, # elem id 4 + 4,5,11,10,9,8]) # elem id 5 + + mesh.add_nodes(num_node,nodeId,nodeCoord,nodeOwner) + + mesh.add_elements(num_elem,elemId,elemType,elemConn) + ++++++++ +Masking ++++++++ + +There are two types of masking available in :class:`~esmpy.api.mesh.Mesh`: node masking and element +masking. These both work in a similar manner, but vary slightly in the details +of setting the mask information during :class:`~esmpy.api.mesh.Mesh` creation. + +For node masking, the mask information is set using the ``node_mask`` parameter. +When a :class:`~esmpy.api.regrid.Regrid` object is created the mask values arguments ``src_mask_values`` and +``dst_mask_values`` can then be used to indicate which particular values set in +the ``node_mask`` array indicate that the node should be masked. For example, if +``dst_mask_values`` has been set to 1, then any node in the destination :class:`~esmpy.api.mesh.Mesh` whose +corresponding ``node_mask`` value is 1 will be masked out (a node with any other +value than 1 will not be masked). + +For element masking, the mask information is set using the ``element_mask`` +parameter when adding elements to the :class:`~esmpy.api.mesh.Mesh`. In a similar manner to node masking, +the mask values parameters to :class:`~esmpy.api.regrid.Regrid`, ``src_mask_values`` and ``dst_mask_values`` +can then be used to indicate which particular values set in the ``element_mask`` +array indicate that the element should be masked. For example, if +``dst_mask_values`` has been set to 1, then any element in the destination :class:`~esmpy.api.mesh.Mesh` +whose corresponding ``element_mask`` value is 1 will be masked out (an element +with any other value than 1 will not be masked). + ++++++ +Areas ++++++ + +:class:`~esmpy.api.mesh.Mesh` cell areas can be specified using the ``element_areas`` parameter to +:class:`~esmpy.api.mesh.Mesh.add_elements()`. + +If cell areas are not specified by the user they can be calculated by ESMPy +using :class:`~esmpy.api.field.Field.get_area()`. + + +~~~~~~~~~ +LocStream +~~~~~~~~~ + +A :class:`~esmpy.api.locstream.LocStream` can be used to represent the locations of a set of +data points. For example, in the data assimilation world, :class:`LocStreams ` can be used +to represent a set of observations. The values of the data points are stored +within a :class:`~esmpy.api.field.Field` created using the :class:`~esmpy.api.locstream.LocStream`. +Refer to the LocStream Class of the +`ESMF Reference Manual `_ +for more information. + +The locations are generally described using Cartesian (x, y, z), or +(lat, lon, radius) coordinates. The coordinates are stored using constructs +called *keys*. A key is essentially a list of point descriptors, one for each data +point. They may hold other information besides the coordinates - a mask, for +example. They may also hold a second set of coordinates. Keys are referenced by +name. Each key must contain the same number of elements as there are data points +in the :class:`~esmpy.api.locstream.LocStream`. While there is no assumption in the ordering of the points, +the order chosen must be maintained in each of the keys. + +A :class:`~esmpy.api.locstream.LocStream` can be very large. Data assimilation systems might use :class:`LocStreams ` +with up to :math:`10^8` observations, so efficiency is critical. :class:`LocStreams ` can be +created from file. + +A :class:`~esmpy.api.locstream.LocStream` is similar to a :class:`~esmpy.api.mesh.Mesh` in that both are collections of irregularly +positioned points. However, the two structures differ because a :class:`~esmpy.api.mesh.Mesh` also has +connectivity: each data point represents either a center or corner of a cell. +There is no requirement that the points in a :class:`~esmpy.api.locstream.LocStream` have connectivity, in +fact there is no requirement that any two points have any particular spatial +relationship at all. + +.. code:: + + locstream = esmpy.LocStream(16, coord_sys=coord_sys) + + deg_rad = pi + if coord_sys == esmpy.CoordSys.SPH_DEG: + deg_rad = 180 + + locstream["ESMF:Lon"] = [0.0, 0.5*deg_rad, 1.5*deg_rad, 2*deg_rad, 0.0, 0.5*deg_rad, 1.5*deg_rad, 2*deg_rad, 0.0, 0.5*deg_rad, 1.5*deg_rad, 2*deg_rad, 0.0, 0.5*deg_rad, 1.5*deg_rad, 2*deg_rad] + locstream["ESMF:Lat"] = [deg_rad/-2.0, deg_rad/-2.0, deg_rad/-2.0, deg_rad/-2.0, -0.25*deg_rad, -0.25*deg_rad, -0.25*deg_rad, -0.25*deg_rad, 0.25*deg_rad, 0.25*deg_rad, 0.25*deg_rad, 0.25*deg_rad, deg_rad/2.0, deg_rad/2.0, deg_rad/2.0, deg_rad/2.0] + if domask: + locstream["ESMF:Mask"] = np.array([1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], dtype=np.int32) + + +------------------------------- +Create a Grid or Mesh from File +------------------------------- + +~~~~~~~~~~~~ +File Formats +~~~~~~~~~~~~ + +ESMPy can create :class:`~esmpy.api.grid.Grid` or :class:`~esmpy.api.mesh.Mesh` objects from NetCDF files in a variety +of formats. A :class:`~esmpy.api.mesh.Mesh` can be created from files in :class:`~esmpy.api.constants.FileFormat.SCRIP`, :class:`~esmpy.api.constants.FileFormat.ESMFMESH`, and :class:`~esmpy.api.constants.FileFormat.UGRID` +formats. :class:`~esmpy.api.grid.Grid` files can be in :class:`~esmpy.api.constants.FileFormat.SCRIP` and :class:`~esmpy.api.constants.FileFormat.GRIDSPEC` format. + ++++++ +SCRIP ++++++ +.. _scrip: + +This file format is used by the :class:`~esmpy.api.constants.FileFormat.SCRIP` :cite:`ref:SCRIP`, package, grid files that +work with that package should also work here. :class:`~esmpy.api.constants.FileFormat.SCRIP` format files are +capable of storing either 2D logically rectangular grids or 2D +unstructured grids. More information can be found in the +`ESMF Reference Manual `_. + +++++++++ +ESMFMESH +++++++++ +.. _esmfmesh: + +ESMF has a custom unstructured grid file format for describing :class:`Meshes `. +This format is more compatible than the :class:`~esmpy.api.constants.FileFormat.SCRIP` format with the methods +used to create a :class:`~esmpy.api.mesh.Mesh` object, so less conversion needs to be done to +create a :class:`~esmpy.api.mesh.Mesh`. The :class:`~esmpy.api.constants.FileFormat.ESMFMESH` format is thus more efficient than :class:`~esmpy.api.constants.FileFormat.SCRIP` when +used with ESMPy. More information can be found in the +`ESMF Reference Manual `_. + +++++++++ +GRIDSPEC +++++++++ +.. _gridspec: + +:class:`~esmpy.api.constants.FileFormat.GRIDSPEC` is an extension to the Climate and Forecast (CF) metadata +conventions for the representation of gridded data for Earth System +Models. ESMPy supports NetCDF files that follow the CF :class:`~esmpy.api.constants.FileFormat.GRIDSPEC` +convention to support logically rectangular lat/lon grids. More +information can be found in the +`ESMF Reference Manual `_. + ++++++ +UGRID ++++++ +.. _ugrid: + +:class:`~esmpy.api.constants.FileFormat.UGRID` is an extension to the CF metadata +conventions for the unstructured grid data model. ESMPy support +NetCDF files that follow the CF :class:`~esmpy.api.constants.FileFormat.UGRID` convention for unstructured grids. +More information can be found in the +`ESMF Reference Manual `_. + +~~~~~~~~~~~~~~~~ +Meshes from File +~~~~~~~~~~~~~~~~ + +When creating a :class:`~esmpy.api.mesh.Mesh` from a :class:`~esmpy.api.constants.FileFormat.SCRIP` format file, there are a number of +options to control the output :class:`~esmpy.api.mesh.Mesh`. The data is located at the center +of the grid cell in a :class:`~esmpy.api.constants.FileFormat.SCRIP` grid. Therefore, when the :class:`~esmpy.api.mesh.Mesh` will be +part of a conservative regridding operation, the ``convert_to_dual`` +flag must be set to True to properly generate coordinates at the the +cell corners. + +A :class:`~esmpy.api.mesh.Mesh` may also be created with boolean flags to specify whether or not to +add an area property to the :class:`~esmpy.api.mesh.Mesh` ``add_user_area``, or to add a mask +``add_mask`` held by the NetCDF variable indicated in the optional argument, +``varname``. These argument are only valid for :class:`~esmpy.api.constants.FileFormat.UGRID` formatted files. +The mask generated for a :class:`~esmpy.api.mesh.Mesh` created from file will +have 0 for the masked values and 1 for the unmasked values. + +~~~~~~~~~~~~~~~ +Grids from File +~~~~~~~~~~~~~~~ + +A number of optional boolean arguments are also supported to create a +structured :class:`~esmpy.api.grid.Grid` from a file. These include ``is_sphere`` to indicate whether +the grid is spherical or regional, ``add_corner_stagger`` to add the corner +stagger information to the :class:`~esmpy.api.grid.Grid` for conservative regridding, and +``add_user_area`` to specify whether to read in the cell area from the +NetCDF file or to calculate them. + +For :class:`~esmpy.api.constants.FileFormat.GRIDSPEC` formated files +there is the ``add_mask`` optional argument +to add a mask held by the NetCDF variable indicated in optional +argument, ``varname``, and the ``coord_names`` argument to specify the longitude +and latitude variable names in a :class:`~esmpy.api.constants.FileFormat.GRIDSPEC` file containing multiple sets of +coordinates. + +For :class:`~esmpy.api.constants.FileFormat.SCRIP` formated files the integer array ``grid_imask`` is used to mask out grid cells which should not participate in the regridding. + +The mask generated for a :class:`~esmpy.api.grid.Grid` created from +file (any format) will have 0 for the masked values and 1 for the unmasked values. + + +---------- +Regridding +---------- + +The following table describe the regridding methods and options that are +available in ESMPy, the flag that is required to use it and a short description. +More information can be found on these options in the +`ESMF Reference Manual `_. + + +======================================================= =============================================== +Class Description +======================================================= =============================================== +:class:`~esmpy.api.constants.RegridMethod.BILINEAR` Linear regridding in two dimensions +:class:`~esmpy.api.constants.RegridMethod.PATCH` Higher-order least squares method +:class:`~esmpy.api.constants.RegridMethod.NEAREST_STOD` Nearest source point used for each destination +:class:`~esmpy.api.constants.RegridMethod.NEAREST_DTOS` Nearest destination point used for each source +:class:`~esmpy.api.constants.RegridMethod.CONSERVE` First-order conservative +:class:`~esmpy.api.constants.RegridMethod.CONSERVE_2ND` Second-order conservative +:class:`~esmpy.api.constants.NormType` Normalization options for integral conservation +:class:`~esmpy.api.constants.LineType` Line types for spherical and Cartesian space +:class:`~esmpy.api.constants.UnmappedAction` Unmapped destination point handling options +:class:`~esmpy.api.constants.CoordSys` Spherical grids and pole handling +======================================================= =============================================== + +~~~~~~~~~~~~~~~~~~ +Great Circle Cells +~~~~~~~~~~~~~~~~~~ + +For Grids and Meshes on a sphere some combinations of interpolation options +(e.g. first and second-order conservative methods) use cells whose edges are +great circles. This section describes some behavior that the user may not expect +from these cells and some potential solutions. A great circle edge isn't +necessarily the same as a straight line in latitude longitude space. For small +edges, this difference will be small, but for long edges it could be +significant. This means if the user expects cell edges as straight lines in +latitude longitude space, they should avoid using one large cell with long edges +to compute an average over a region (e.g. over an ocean basin). + +Also, the user should also avoid using cells that contain one edge that runs +half way or more around the earth, because the regrid weight calculation assumes +the edge follows the shorter great circle path. There isn't a unique great +circle edge defined between points on the exact opposite side of the earth from +one another (antipodal points). However, the user can work around both of these +problem by breaking the long edge into two smaller edges by inserting an extra +node, or by breaking the large target grid cells into two or more smaller grid +cells. This allows the application to resolve the ambiguity in edge direction. + +------- +Masking +------- +.. _masking: + +Masking is the process whereby parts of a :class:`~esmpy.api.grid.Grid`, :class:`~esmpy.api.mesh.Mesh` or :class:`~esmpy.api.locstream.LocStream` can be marked to be ignored +during an operation, such as when they are used in regridding. Masking can be used on a :class:`~esmpy.api.field.Field` +created from a regridding source to indicate that certain portions should not be used to generate +regridded data. This is useful, for example, if a portion of the source contains unusable values. +Masking can also be used on a :class:`~esmpy.api.field.Field` created from a regridding destination to indicate that a certain +portion should not receive regridded data. This is useful, for example, when part of the destination +isn't being used (e.g. the land portion of an ocean grid). + +The user may mask out points in the source :class:`~esmpy.api.field.Field` or destination :class:`~esmpy.api.field.Field` or both. To do masking the user +sets mask information in the :class:`~esmpy.api.grid.Grid`, :class:`~esmpy.api.mesh.Mesh`, or :class:`~esmpy.api.locstream.LocStream` upon +which the :class:`Fields ` passed into the :class:`~esmpy.api.regrid.Regrid` call are built. The ``src_mask_values`` and +``dst_mask_values`` arguments to that call can then be used to specify which values in that mask information +indicate that a location should be masked out. For example, if ``dst_mask_values`` is set to [1,2], then any +location that has a value of 1 or 2 in the mask information of the :class:`~esmpy.api.grid.Grid`, :class:`~esmpy.api.mesh.Mesh` or :class:`~esmpy.api.locstream.LocStream` upon which +the destination :class:`~esmpy.api.field.Field` is built will be masked out. + +Masking behavior differs slightly between regridding methods. For non-conservative regridding methods +(e.g. bilinear or high-order patch), masking is done on points. For these methods, masking a destination +point means that the point will not participate in regridding. For these +methods, masking a source point means that the entire source cell using that point is masked out. +In other words, if any corner point making up a source cell is masked then the cell is masked. +For conservative regridding methods masking is done on cells. +Masking a destination cell means that the cell won't participate in regridding. +Similarly, masking a source cell means that the cell won't participate in regridding. +For any type of interpolation method (conservative or non-conservative) +the masking is set on the location upon which the +:class:`Fields ` passed into the regridding call are built. +For example, if :class:`Fields ` built on +:class:`StaggerLoc.CENTER ` are passed into +:class:`~esmpy.api.regrid.Regrid` +then the masking should also be set on :class:`StaggerLoc.CENTER `. + +The mask generated for a :class:`~esmpy.api.grid.Grid`, +:class:`~esmpy.api.mesh.Mesh` or :class:`~esmpy.api.locstream.LocStream` created +from file will have 0 for the masked values and 1 for the unmasked values. + +.. Note:: The :class:`Region.SELECT ` flag to the +``zero_region`` parameter of :class:`~esmpy.api.regrid.Regrid` can be used to +maintain :class:`Fields ` values on locations that do not +participate in the regridding operation. This is useful when setting an +uninitialized value to help identify masked locations within the +:class:`Fields ` data. + + +-------------------------- +Numpy Slicing and Indexing +-------------------------- + +Numpy arrays are used to represent :class:`~esmpy.api.grid.Grid`, :class:`~esmpy.api.mesh.Mesh` and :class:`~esmpy.api.locstream.LocStream` coordinates and :class:`~esmpy.api.field.Field` data, +among other things. Standard numpy conventions for array indexing +and slicing can be expected. There are some exceptions when it comes to fancy +indexing, index arrays, and multi-dimensional slicing. Significant effort has +been put into raising exceptions where inappropriate indexing or slicing +operations are attempted. + +It is very important to remember that all indexing +and slicing operations apply **ONLY** to the ESMPy level objects, and these operations +do not propagate down to the lower-level Fortran- and C-based representations +of the ESMF objects. One example of where this could come up is when passing +a :class:`~esmpy.api.field.Field` slice into regridding. The entire original :class:`~esmpy.api.field.Field` will still be run +through the ESMF regridding engine, and only the appropriate portion of +the :class:`~esmpy.api.field.Field` slice will be updated with the regridded values. + +~~~~~~~~~~~~~~~~~~ +Dimension Ordering +~~~~~~~~~~~~~~~~~~ + +.. Warning:: The underlying ESMF library is built with a mix of Fortran and C/C++ + and follows Fortran conventions with respect to array indexing and + dimension ordering. Some effort has been made to make ESMPy feel more + natural to the Python user where possible. This means that ESMPy uses + 0-based indexing, which is translated to the 1-based indexing used by + the ESMPy backend. The only exception to this is NetCDF files that are + generated by ESMPy will continue to use the 1-based indexing from the + underlying ESMF code. Likewise, the dimension ordering still follows + Fortran conventions. This means that longitude comes before latitude, which + also comes before temporal dimensions, when in use. + + .. code:: + + In [1]: import numpy as np + ...: import esmpy + ...: + ...: grid = esmpy.Grid(np.array([3,4]), staggerloc=esmpy.StaggerLoc.CENTER) + ...: + ...: gridLon = grid.get_coords(0) + ...: gridLat = grid.get_coords(1) + ...: + ...: lon = np.linspace(-120,120,3) + ...: lat = np.linspace(-67.5, 67.5,4) + ...: + ...: lonm, latm = np.meshgrid(lon, lat, indexing='ij') + ...: + ...: gridLon[:] = lonm + ...: gridLat[:] = latm + ...: + + In [2]: grid.coords[esmpy.StaggerLoc.CENTER][0].shape + Out[2]: (3, 4) + + In [3]: lon.shape + Out[3]: (3,) + + In [4]: lat.shape + Out[4]: (4,) + + In [5]: grid.coords[esmpy.StaggerLoc.CENTER][0] + Out[5]: + array([[-120., -120., -120., -120.], + [ 0., 0., 0., 0.], + [ 120., 120., 120., 120.]]) + + In [6]: grid.coords[esmpy.StaggerLoc.CENTER][1] + Out[6]: + array([[-67.5, -22.5, 22.5, 67.5], + [-67.5, -22.5, 22.5, 67.5], + [-67.5, -22.5, 22.5, 67.5]]) + + In [7]: field = esmpy.Field(grid, ndbounds=[10]) # create a Field with a time dimension + + In [8]: field.data.shape + Out[8]: (3, 4, 10) + + +------------------ +Parallel Execution +------------------ + +ESMPy is a thin wrapper on top of ESMF, which was designed for high performance +and scalable computing. The ESMF virtual machine is used to manage the available +resources of the execution environment in a layer that is transparent to the +ESMPy user. This allows the full power of the high performance computing +environment to be utilized by the ESMPy user with little use of specialized +parallel programming techniques. + +ESMPy objects will be distributed across the available computing resources with +no additional parameters required. The :class:`~esmpy.api.grid.Grid`, :class:`~esmpy.api.mesh.Mesh`, :class:`~esmpy.api.locstream.LocStream`, and :class:`~esmpy.api.field.Field` classes +will all be transparently "parallelized" with no need for user calls to a +message passing interface. Likewise, the :class:`~esmpy.api.regrid.Regrid` class will compute and apply +the interpolation weights using all available computing resources with no need +for user intervention. + +However, it is useful to remember that resulting :class:`~esmpy.api.field.Field` values will only be +accessible on certain PETs. The mpi4py package may be necessary for post +processing tasks that require access to global :class:`~esmpy.api.field.Field` values. + +~~~~~~~~~~~~~~~~~~~~ +mpirun vs. MPI.Spawn +~~~~~~~~~~~~~~~~~~~~ + +There are a few different options for using ESMPy in a parallel +environment. Using mpirun to specify the desired number of computing cores +is probably the easiest way to start a parallel ESMPy job. Another option is to +call the MPI.Spawn() function from the mpi4py Python package from within a +serial Python script or interpreter. It has been observed that MPI.Spawn() may +not work properly when mpi4py is built with an underlying mpich +library, openmpi has seen better success. A third option is to call mpirun +using a system call from within a serial Python script or interpreter, however +this method is not highly recommended. + +The following two examples demonstrate how to execute an ESMPy script in +parallel. Any of the scripts found in the examples directory of the ESMPy source +code can be run in parallel using mpirun as well as in serial mode. + +++++++ +mpirun +++++++ + +:: + + mpirun -n 4 python hello_world.py + ++++++++++ +MPI.Spawn ++++++++++ + +:: + + import sys + from mpi4py import MPI + + # Parent + if len(sys.argv) == 1: + + # Spawn workers + comm = MPI.COMM_WORLD.Spawn( + sys.executable, + args=[sys.argv[0], 'worker'], + maxprocs=4) + + # Shutdown + comm.Disconnect() + + # Worker + elif sys.argv[1] == 'worker': + + # Connect to parent + try: + comm = MPI.Comm.Get_parent() + rank = comm.Get_rank() + except: + raise ValueError('Could not connect to parent - ' + usage) + + # worker code goes here, regridding etc.. + print "Hello World from PET #"+str(rank) + + # Shutdown + comm.Disconnect() + + # Catch + else: + raise ValueError('Program should be started without arguments') + +A more detailed example of using MPI.Spawn() can be found in the Tutorials section +of the documentation. diff --git a/docs/nightly/fix/reconcile-info/html/_sources/appendix.rst.txt b/docs/nightly/fix/reconcile-info/html/_sources/appendix.rst.txt new file mode 100644 index 00000000..604b74e1 --- /dev/null +++ b/docs/nightly/fix/reconcile-info/html/_sources/appendix.rst.txt @@ -0,0 +1,49 @@ + +========== +Appendices +========== + +---------- +Class APIs +---------- + +.. toctree:: + + manager + field + grid + mesh + locstream + regrid + regridfromfile + +--------------- +Named Constants +--------------- + +.. toctree:: + + CoordSys + ExtrapMethod + FileFormat + FileMode + GridItem + LineType + LogKind + MeshElemType + MeshLoc + NormType + PoleKind + PoleMethod + Region + RegridMethod + StaggerLoc + TypeKind + UnmappedAction + +---------- +References +---------- + +.. bibliography:: ../../../Infrastructure/Mesh/doc/Mesh.bib ../../../doc/ESMF_packages.bib ../../../Infrastructure/Regrid/doc/Regrid.bib + :style: unsrt diff --git a/docs/nightly/fix/reconcile-info/html/_sources/examples.rst.txt b/docs/nightly/fix/reconcile-info/html/_sources/examples.rst.txt new file mode 100644 index 00000000..06e8c522 --- /dev/null +++ b/docs/nightly/fix/reconcile-info/html/_sources/examples.rst.txt @@ -0,0 +1,139 @@ +========= +Tutorials +========= + +----------- +Hello World +----------- + + .. literalinclude:: ../examples/hello_world.py + +--------------------------- +Regridding Helper Functions +--------------------------- + +The following code snippets demonstrate how to build all of the pieces +necessary to regrid data between :class:`Fields ` built on +:class:`Grids `, :class:`Meshes ` +and :class:`LocStreams `. + +~~~~~~~~~~~~~~~~ +LocStream Create +~~~~~~~~~~~~~~~~ + +.. literalinclude:: ../src/esmpy/util/locstream_utilities.py + :pyobject: create_locstream_spherical_16 + +~~~~~~~~~~~~~~~~~~~~~~~~~ +LocStream Create Parallel +~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. literalinclude:: ../src/esmpy/util/locstream_utilities.py + :pyobject: create_locstream_spherical_16_parallel + +~~~~~~~~~~~~~~~~ +Create a 2D Grid +~~~~~~~~~~~~~~~~ + + .. literalinclude:: ../src/esmpy/util/grid_utilities.py + :pyobject: grid_create_from_coordinates + +~~~~~~~~~~~~~~~~ +Create a 3D Grid +~~~~~~~~~~~~~~~~ + + .. literalinclude:: ../src/esmpy/util/grid_utilities.py + :pyobject: grid_create_from_coordinates_3d + +~~~~~~~~~~~~~~~~~~~~~~ +Create a Periodic Grid +~~~~~~~~~~~~~~~~~~~~~~ + + .. literalinclude:: ../src/esmpy/util/grid_utilities.py + :pyobject: grid_create_from_coordinates_periodic + +~~~~~~~~~~~~~~~~~~~~~~~ +Create a 5 Element Mesh +~~~~~~~~~~~~~~~~~~~~~~~ + + .. literalinclude:: ../src/esmpy/util/mesh_utilities.py + :pyobject: mesh_create_5 + +~~~~~~~~~~~~~~ +Create a Field +~~~~~~~~~~~~~~ + + .. literalinclude:: ../src/esmpy/test/test_api/test_field.py + :pyobject: TestField.create_field + + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Initialize an Analytic Field +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + .. literalinclude:: ../src/esmpy/util/grid_utilities.py + :pyobject: initialize_field_grid_periodic + + +~~~~~~~~~~~~~~~~~~~~ +Run ESMPy Regridding +~~~~~~~~~~~~~~~~~~~~ + + .. literalinclude:: ../src/esmpy/test/test_api/test_regrid.py + :pyobject: TestRegrid.run_regridding + + +~~~~~~~~~~~~~~~~~~ +Compute Field Mass +~~~~~~~~~~~~~~~~~~ + + .. literalinclude:: ../src/esmpy/util/grid_utilities.py + :pyobject: compute_mass_grid + + +---------- +Regridding +---------- + +The following stand alone scripts demonstrate how to use regridding between +:class:`Fields ` built on +:class:`Grids `, :class:`Meshes ` +and :class:`LocStreams `. These scripts +can be run in serial or parallel with no modification. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Grid, Mesh and Field Created from File +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + .. literalinclude:: ../examples/regrid_from_file.py + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Read and Write a Weight File +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + .. literalinclude:: ../examples/read_write_weight_file.py + +~~~~~~~~~~~~~~~~~ +Grid to LocStream +~~~~~~~~~~~~~~~~~ + + .. literalinclude:: ../examples/grid_locstream_regrid.py + +~~~~~~~~~~~~~~~~~ +Mesh to LocStream +~~~~~~~~~~~~~~~~~ + + .. literalinclude:: ../examples/mesh_locstream_regrid.py + +~~~~~~~~~~~~~~~~~ +LocStream to Grid +~~~~~~~~~~~~~~~~~ + + .. literalinclude:: ../examples/locstream_grid_regrid.py + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Using MPI.Spawn() from a Serial Python Driver +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + .. literalinclude:: ../examples/mpi_spawn_regrid.py + diff --git a/docs/nightly/fix/reconcile-info/html/_sources/field.rst.txt b/docs/nightly/fix/reconcile-info/html/_sources/field.rst.txt new file mode 100644 index 00000000..f1644ce1 --- /dev/null +++ b/docs/nightly/fix/reconcile-info/html/_sources/field.rst.txt @@ -0,0 +1,9 @@ +~~~~~ +Field +~~~~~ + +.. autoclass:: esmpy.api.field.Field + :members: copy, destroy, get_area, read, + data, grid, lower_bounds, name, ndbounds, rank, staggerloc, type, + upper_bounds, xd + \ No newline at end of file diff --git a/docs/nightly/fix/reconcile-info/html/_sources/grid.rst.txt b/docs/nightly/fix/reconcile-info/html/_sources/grid.rst.txt new file mode 100644 index 00000000..e3995924 --- /dev/null +++ b/docs/nightly/fix/reconcile-info/html/_sources/grid.rst.txt @@ -0,0 +1,9 @@ +~~~~ +Grid +~~~~ + +.. autoclass:: esmpy.api.grid.Grid + :members: add_coords, add_item, copy, destroy, get_coords, get_item, + area, areatype, coords, coord_sys, has_corners, + lower_bounds, mask, max_index, num_peri_dims, periodic_dim, pole_dim, + rank, size, staggerloc, type, upper_bounds \ No newline at end of file diff --git a/docs/nightly/fix/reconcile-info/html/_sources/index.rst.txt b/docs/nightly/fix/reconcile-info/html/_sources/index.rst.txt new file mode 100644 index 00000000..b7b2805e --- /dev/null +++ b/docs/nightly/fix/reconcile-info/html/_sources/index.rst.txt @@ -0,0 +1,24 @@ +.. ESMPy documentation master file, created by + sphinx-quickstart on Tue Dec 6 12:05:22 2011. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +================= +Table of Contents +================= + +Welcome to ESMPy - The ESMF Python Interface! + +.. toctree:: + :maxdepth: 3 + + intro + install + examples + api + appendix + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` + diff --git a/docs/nightly/fix/reconcile-info/html/_sources/install.rst.txt b/docs/nightly/fix/reconcile-info/html/_sources/install.rst.txt new file mode 100644 index 00000000..96df08d5 --- /dev/null +++ b/docs/nightly/fix/reconcile-info/html/_sources/install.rst.txt @@ -0,0 +1,162 @@ +============ +Installation +============ + +------------ +Requirements +------------ + +The following packages are *required* to work with ESMPy: + +* `ESMF installation `_ +* `python `_, minimum version 3.7 +* `numpy `_ + +The following packages are *optional*: + +* ESMF installation with NetCDF - required to create :class:`Grids `, :class:`Meshes ` and :class:`Fields ` from file, and to write regridding weights to file + - NetCDF must be built as a shared library for ESMPy installation to succeed +* ESMF installation with PIO (the Parallel IO library) - required to create :class:`Meshes ` and :class:`Fields ` from file, and to write regridding weights to file +* `mpi4py `_- python bindings to MPI, needed to run some of the parallel regridding examples +* `pytest `_ - for testing + +---------------- +Getting the code +---------------- + +The ESMPy source code can be downloaded from the +`ESMF git repository `_. + +The `ESMF User's Guide `_ +contains information on building and installing esmpy. + +The `ESMF Reference Manual `_ +contains information on the architecture of ESMF, example code, and details of the API (Application Programming +Interface). + +~~~~~~~~~~~~~~~~~ +Anaconda Packages +~~~~~~~~~~~~~~~~~ + +ESMPy conda packages are available through the conda-forge channel: + +.. code:: + + conda create -n esmpy -c conda-forge esmpy + +Specific versions of the conda package can be installed like this: + +.. code:: + + conda create -n esmpy -c conda-forge esmpy=8.1.0 + +Development versions can be found in the ``esmpy_dev`` channel: + +.. code:: + + conda create -n esmpy -c conda-forge -c esmpy_dev esmpy + +---------------------------- +Installing ESMPy from Source +---------------------------- + +When installing from source, ESMPy uses `pip `_ +to build and install the package. An installation of ESMPy in the default location for Python packages can be done +with the following command issued from the top level ESMPy directory (``src/addon/esmpy``): + +.. code:: + + python3 -m pip install . + +Please contact esmf_support@ucar.edu with any questions. + +.. Note:: + + With some python versions, there is a problem with the automatic installation of the required package ``setuptools-git-versioning``. If the output from the ``pip install`` command ends with ``Successfully installed esmpy-0.0.0``, this indicates that the ``setuptools-git-versioning`` package was not invoked and the build thinks you are using ESMF version 0.0.0. This will cause problems when you try to use ESMPy. To solve this problem, simply rerun the above installation command (``python3 -m pip install .``). You should then see a reasonable version number at the end, such as, ``Successfully installed esmpy-8.4.0``. + +--------------- +Importing ESMPy +--------------- + +To use ESMPy in an external program, import it with: + +.. code:: + + import esmpy + +The environment variable ``ESMFMKFILE`` should be set when using ESMPy. If it is not found, the package will +try to guess a few very common locations, but we recommend correctly setting the variable nonetheless. + +.. Note:: + + The Python module name for ESMPy was changed in v8.4.0 from "ESMF" to "esmpy". If you are using a version older than v8.4.0, the import command is ``import ESMF``. See the `ESMF Release Notes `_ for more details and links to previous versions of the ESMPy documentation. + +---------- +Validation +---------- + +The ESMPy testing is done with the pytest package, both in serial and +parallel. Basic unit tests can be run with the following command, from +the top level ESMPy directory (``src/addon/esmpy``): + +.. code:: + + python3 -m pytest + +There are a few other pytest targets available for a wider range of testing if +greater test coverage is desired: + +.. code:: + + make test_unit + + make test_examples + + make test_unit_parallel + + make test_examples_parallel + + make test_regrid_from_file + +.. Note:: + + The ``regrid_from_file`` and ``example`` tests can take up a lot of memory + and bandwidth. The ``download_regrid_from_file`` and ``download_examples`` + commands will simply download the test files without actually running them + (allowing the stress on the machine to be applied to bandwidth first, and + then memory). + +.. Note:: + + By default, test data will be downloaded to a ``data`` subdirectory of the ESMPy installation directory. This location can be changed by setting one of the following environment variables: + + - If ``ESMPY_DATA_DIR`` is set, this should point to a directory that has already been populated with the necessary data; the pre-existing data will be read from this directory and no automatic downloads will be attempted. + + - Otherwise, if ``ESMPY_DATA_NEW_DIR`` is set, data will be downloaded to the path set by this variable instead of using the ``data`` subdirectory of the ESMPy installation directory. + +----------- +Limitations +----------- + +ESMPy doesn't include many aspects of ESMF, including components, field bundles, +time management, etc. The limitations listed here are relative +to ESMF offline and integrated regridding capabilities. + +- ESMPy cannot use an ESMF installation that is built with external LAPACK + support. +- Coordinates cannot be retrieved from the elements of a + :class:`~esmpy.api.mesh.Mesh`. This can affect the ability to set + :class:`~esmpy.api.field.Field` values on a source :class:`~esmpy.api.mesh.Mesh` + created from file when using conservative regridding. +- Multi-tile :class:`~esmpy.api.grid.Grid` support is limited to cubed-sphere + grids created on 6 processors. A cubed-sphere grid can be created on any + number of processors, but only when it is created on 6 processors will the + coordinates be retrievable for the entire object. A + :class:`~esmpy.api.field.Field` created from a cubed-sphere + :class:`~esmpy.api.grid.Grid` cannot be written to file in parallel. +- There is no ``FieldBundle`` class, only single :class:`Fields `. + +Testing related: + +- Nightly regression testing is limited to a small subset of the ESMF test platforms, + including Darwin and Linux running gfortran with openMPI. diff --git a/docs/nightly/fix/reconcile-info/html/_sources/intro.rst.txt b/docs/nightly/fix/reconcile-info/html/_sources/intro.rst.txt new file mode 100644 index 00000000..ce4ee2b2 --- /dev/null +++ b/docs/nightly/fix/reconcile-info/html/_sources/intro.rst.txt @@ -0,0 +1,30 @@ +-------- +Overview +-------- + +.. automodule:: esmpy + +--------------- +Important Links +--------------- + +The `ESMPy home page `_ has the +latest information on the ESMPy project including release notes, known +bugs, supported platforms, and download information. + +Please see the `ESMF home page `_ +for more information on ESMF in general. + +The `ESMF Regridding webpage +`_ +gives a nice overview of the ESMF regridding functionality, including an +overview of the functionality that is available through +various interfaces to ESMF regridding. + +The ESMF_RegridWeightGen application is a command-line version of the functionality that is available through ESMPy. +The Regid class gives a thorough overview of the regridding engine that is used by ESMPy. +Information on these can be found in the +`ESMF Reference Manual +`_. + +Please contact esmf_support@ucar.edu with any questions or problems. diff --git a/docs/nightly/fix/reconcile-info/html/_sources/locstream.rst.txt b/docs/nightly/fix/reconcile-info/html/_sources/locstream.rst.txt new file mode 100644 index 00000000..79a784a2 --- /dev/null +++ b/docs/nightly/fix/reconcile-info/html/_sources/locstream.rst.txt @@ -0,0 +1,6 @@ +~~~~~~~~~ +LocStream +~~~~~~~~~ + +.. autoclass:: esmpy.api.locstream.LocStream + :members: copy, destroy, lower_bounds, name, rank, size, upper_bounds diff --git a/docs/nightly/fix/reconcile-info/html/_sources/manager.rst.txt b/docs/nightly/fix/reconcile-info/html/_sources/manager.rst.txt new file mode 100644 index 00000000..5b3fa316 --- /dev/null +++ b/docs/nightly/fix/reconcile-info/html/_sources/manager.rst.txt @@ -0,0 +1,6 @@ +~~~~~~~ +Manager +~~~~~~~ + +.. autoclass:: esmpy.api.esmpymanager.Manager + :members: local_pet, moab, pet_count, barrier, set_moab \ No newline at end of file diff --git a/docs/nightly/fix/reconcile-info/html/_sources/mesh.rst.txt b/docs/nightly/fix/reconcile-info/html/_sources/mesh.rst.txt new file mode 100644 index 00000000..7c2b3839 --- /dev/null +++ b/docs/nightly/fix/reconcile-info/html/_sources/mesh.rst.txt @@ -0,0 +1,7 @@ +~~~~ +Mesh +~~~~ + +.. autoclass:: esmpy.api.mesh.Mesh + :members: copy, destroy, add_elements, add_nodes, free_memory, get_coords, + area, coords, coord_sys, mask, rank, size, size_owned \ No newline at end of file diff --git a/docs/nightly/fix/reconcile-info/html/_sources/regrid.rst.txt b/docs/nightly/fix/reconcile-info/html/_sources/regrid.rst.txt new file mode 100644 index 00000000..f647deb5 --- /dev/null +++ b/docs/nightly/fix/reconcile-info/html/_sources/regrid.rst.txt @@ -0,0 +1,6 @@ +~~~~~~ +Regrid +~~~~~~ + +.. autoclass:: esmpy.api.regrid.Regrid + :members: copy, destroy, __call__, get_factors, get_weights_dict diff --git a/docs/nightly/fix/reconcile-info/html/_sources/regridfromfile.rst.txt b/docs/nightly/fix/reconcile-info/html/_sources/regridfromfile.rst.txt new file mode 100644 index 00000000..ed5af263 --- /dev/null +++ b/docs/nightly/fix/reconcile-info/html/_sources/regridfromfile.rst.txt @@ -0,0 +1,6 @@ +~~~~~~~~~~~~~~ +RegridFromFile +~~~~~~~~~~~~~~ + +.. autoclass:: esmpy.api.regrid.RegridFromFile + :members: copy, destroy, __call__ diff --git a/docs/nightly/fix/reconcile-info/html/_static/basic.css b/docs/nightly/fix/reconcile-info/html/_static/basic.css new file mode 100644 index 00000000..cfc60b86 --- /dev/null +++ b/docs/nightly/fix/reconcile-info/html/_static/basic.css @@ -0,0 +1,921 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, figure.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, figure.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, figure.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, figure.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px; + background-color: #ffe; + width: 40%; + float: right; + clear: right; + overflow-x: auto; +} + +p.sidebar-title { + font-weight: bold; +} + +nav.contents, +aside.topic, +div.admonition, div.topic, blockquote { + clear: left; +} + +/* -- topics ---------------------------------------------------------------- */ + +nav.contents, +aside.topic, +div.topic { + border: 1px solid #ccc; + padding: 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +aside.sidebar > :last-child, +nav.contents > :last-child, +aside.topic > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +aside.sidebar::after, +nav.contents::after, +aside.topic::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + margin-top: 10px; + margin-bottom: 10px; + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist { + margin: 1em 0; +} + +table.hlist td { + vertical-align: top; +} + +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} + +aside.footnote > span, +div.citation > span { + float: left; +} +aside.footnote > span:last-of-type, +div.citation > span:last-of-type { + padding-right: 0.5em; +} +aside.footnote > p { + margin-left: 2em; +} +div.citation > p { + margin-left: 4em; +} +aside.footnote > p:last-of-type, +div.citation > p:last-of-type { + margin-bottom: 0em; +} +aside.footnote > p:last-of-type:after, +div.citation > p:last-of-type:after { + content: ""; + clear: both; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +.sig dd { + margin-top: 0px; + margin-bottom: 0px; +} + +.sig dl { + margin-top: 0px; + margin-bottom: 0px; +} + +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +pre, div[class*="highlight-"] { + clear: both; +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; + white-space: nowrap; +} + +div[class*="highlight-"] { + margin: 1em 0; +} + +td.linenos pre { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; +} + +div.code-block-caption { + margin-top: 1em; + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +table.highlighttable td.linenos, +span.linenos, +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/docs/nightly/fix/reconcile-info/html/_static/classic.css b/docs/nightly/fix/reconcile-info/html/_static/classic.css new file mode 100644 index 00000000..d0ed3264 --- /dev/null +++ b/docs/nightly/fix/reconcile-info/html/_static/classic.css @@ -0,0 +1,269 @@ +/* + * classic.css_t + * ~~~~~~~~~~~~~ + * + * Sphinx stylesheet -- classic theme. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +@import url("basic.css"); + +/* -- page layout ----------------------------------------------------------- */ + +html { + /* CSS hack for macOS's scrollbar (see #1125) */ + background-color: #FFFFFF; +} + +body { + font-family: sans-serif; + font-size: 100%; + background-color: #11303d; + color: #000; + margin: 0; + padding: 0; +} + +div.document { + display: flex; + background-color: #1c4e63; +} + +div.documentwrapper { + float: left; + width: 100%; +} + +div.bodywrapper { + margin: 0 0 0 230px; +} + +div.body { + background-color: #ffffff; + color: #000000; + padding: 0 20px 30px 20px; +} + +div.footer { + color: #ffffff; + width: 100%; + padding: 9px 0 9px 0; + text-align: center; + font-size: 75%; +} + +div.footer a { + color: #ffffff; + text-decoration: underline; +} + +div.related { + background-color: #133f52; + line-height: 30px; + color: #ffffff; +} + +div.related a { + color: #ffffff; +} + +div.sphinxsidebar { +} + +div.sphinxsidebar h3 { + font-family: 'Trebuchet MS', sans-serif; + color: #ffffff; + font-size: 1.4em; + font-weight: normal; + margin: 0; + padding: 0; +} + +div.sphinxsidebar h3 a { + color: #ffffff; +} + +div.sphinxsidebar h4 { + font-family: 'Trebuchet MS', sans-serif; + color: #ffffff; + font-size: 1.3em; + font-weight: normal; + margin: 5px 0 0 0; + padding: 0; +} + +div.sphinxsidebar p { + color: #ffffff; +} + +div.sphinxsidebar p.topless { + margin: 5px 10px 10px 10px; +} + +div.sphinxsidebar ul { + margin: 10px; + padding: 0; + color: #ffffff; +} + +div.sphinxsidebar a { + color: #98dbcc; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + + + +/* -- hyperlink styles ------------------------------------------------------ */ + +a { + color: #355f7c; + text-decoration: none; +} + +a:visited { + color: #355f7c; + text-decoration: none; +} + +a:hover { + text-decoration: underline; +} + + + +/* -- body styles ----------------------------------------------------------- */ + +div.body h1, +div.body h2, +div.body h3, +div.body h4, +div.body h5, +div.body h6 { + font-family: 'Trebuchet MS', sans-serif; + background-color: #f2f2f2; + font-weight: normal; + color: #20435c; + border-bottom: 1px solid #ccc; + margin: 20px -20px 10px -20px; + padding: 3px 0 3px 10px; +} + +div.body h1 { margin-top: 0; font-size: 200%; } +div.body h2 { font-size: 160%; } +div.body h3 { font-size: 140%; } +div.body h4 { font-size: 120%; } +div.body h5 { font-size: 110%; } +div.body h6 { font-size: 100%; } + +a.headerlink { + color: #c60f0f; + font-size: 0.8em; + padding: 0 4px 0 4px; + text-decoration: none; +} + +a.headerlink:hover { + background-color: #c60f0f; + color: white; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + text-align: justify; + line-height: 130%; +} + +div.admonition p.admonition-title + p { + display: inline; +} + +div.admonition p { + margin-bottom: 5px; +} + +div.admonition pre { + margin-bottom: 5px; +} + +div.admonition ul, div.admonition ol { + margin-bottom: 5px; +} + +div.note { + background-color: #eee; + border: 1px solid #ccc; +} + +div.seealso { + background-color: #ffc; + border: 1px solid #ff6; +} + +nav.contents, +aside.topic, +div.topic { + background-color: #eee; +} + +div.warning { + background-color: #ffe4e4; + border: 1px solid #f66; +} + +p.admonition-title { + display: inline; +} + +p.admonition-title:after { + content: ":"; +} + +pre { + padding: 5px; + background-color: unset; + color: unset; + line-height: 120%; + border: 1px solid #ac9; + border-left: none; + border-right: none; +} + +code { + background-color: #ecf0f3; + padding: 0 1px 0 1px; + font-size: 0.95em; +} + +th, dl.field-list > dt { + background-color: #ede; +} + +.warning code { + background: #efc2c2; +} + +.note code { + background: #d6d6d6; +} + +.viewcode-back { + font-family: sans-serif; +} + +div.viewcode-block:target { + background-color: #f4debf; + border-top: 1px solid #ac9; + border-bottom: 1px solid #ac9; +} + +div.code-block-caption { + color: #efefef; + background-color: #1c4e63; +} \ No newline at end of file diff --git a/docs/nightly/fix/reconcile-info/html/_static/doctools.js b/docs/nightly/fix/reconcile-info/html/_static/doctools.js new file mode 100644 index 00000000..d06a71d7 --- /dev/null +++ b/docs/nightly/fix/reconcile-info/html/_static/doctools.js @@ -0,0 +1,156 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Base JavaScript utilities for all Sphinx HTML documentation. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + +const _ready = (callback) => { + if (document.readyState !== "loading") { + callback(); + } else { + document.addEventListener("DOMContentLoaded", callback); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + TRANSLATIONS: {}, + PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), + LOCALE: "unknown", + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext: (string) => { + const translated = Documentation.TRANSLATIONS[string]; + switch (typeof translated) { + case "undefined": + return string; // no translation + case "string": + return translated; // translation exists + default: + return translated[0]; // (singular, plural) translation tuple exists + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + initDomainIndexTable: () => { + const toggler = (el) => { + const idNumber = el.id.substr(7); + const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); + if (el.src.substr(-9) === "minus.png") { + el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; + toggledRows.forEach((el) => (el.style.display = "none")); + } else { + el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; + toggledRows.forEach((el) => (el.style.display = "")); + } + }; + + const togglerElements = document.querySelectorAll("img.toggler"); + togglerElements.forEach((el) => + el.addEventListener("click", (event) => toggler(event.currentTarget)) + ); + togglerElements.forEach((el) => (el.style.display = "")); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); + }, + + initOnKeyListeners: () => { + // only install a listener if it is really needed + if ( + !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && + !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS + ) + return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.altKey || event.ctrlKey || event.metaKey) return; + + if (!event.shiftKey) { + switch (event.key) { + case "ArrowLeft": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const prevLink = document.querySelector('link[rel="prev"]'); + if (prevLink && prevLink.href) { + window.location.href = prevLink.href; + event.preventDefault(); + } + break; + case "ArrowRight": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const nextLink = document.querySelector('link[rel="next"]'); + if (nextLink && nextLink.href) { + window.location.href = nextLink.href; + event.preventDefault(); + } + break; + } + } + + // some keyboard layouts may need Shift to get / + switch (event.key) { + case "/": + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; + Documentation.focusSearchBar(); + event.preventDefault(); + } + }); + }, +}; + +// quick alias for translations +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/docs/nightly/fix/reconcile-info/html/_static/documentation_options.js b/docs/nightly/fix/reconcile-info/html/_static/documentation_options.js new file mode 100644 index 00000000..532c33a2 --- /dev/null +++ b/docs/nightly/fix/reconcile-info/html/_static/documentation_options.js @@ -0,0 +1,14 @@ +var DOCUMENTATION_OPTIONS = { + URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'), + VERSION: '8.8.0b0', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/docs/nightly/fix/reconcile-info/html/_static/file.png b/docs/nightly/fix/reconcile-info/html/_static/file.png new file mode 100644 index 0000000000000000000000000000000000000000..a858a410e4faa62ce324d814e4b816fff83a6fb3 GIT binary patch literal 286 zcmV+(0pb3MP)s`hMrGg#P~ix$^RISR_I47Y|r1 z_CyJOe}D1){SET-^Amu_i71Lt6eYfZjRyw@I6OQAIXXHDfiX^GbOlHe=Ae4>0m)d(f|Me07*qoM6N<$f}vM^LjV8( literal 0 HcmV?d00001 diff --git a/docs/nightly/fix/reconcile-info/html/_static/language_data.js b/docs/nightly/fix/reconcile-info/html/_static/language_data.js new file mode 100644 index 00000000..250f5665 --- /dev/null +++ b/docs/nightly/fix/reconcile-info/html/_static/language_data.js @@ -0,0 +1,199 @@ +/* + * language_data.js + * ~~~~~~~~~~~~~~~~ + * + * This script contains the language-specific data used by searchtools.js, + * namely the list of stopwords, stemmer, scorer and splitter. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +var stopwords = ["a", "and", "are", "as", "at", "be", "but", "by", "for", "if", "in", "into", "is", "it", "near", "no", "not", "of", "on", "or", "such", "that", "the", "their", "then", "there", "these", "they", "this", "to", "was", "will", "with"]; + + +/* Non-minified version is copied as a separate JS file, is available */ + +/** + * Porter Stemmer + */ +var Stemmer = function() { + + var step2list = { + ational: 'ate', + tional: 'tion', + enci: 'ence', + anci: 'ance', + izer: 'ize', + bli: 'ble', + alli: 'al', + entli: 'ent', + eli: 'e', + ousli: 'ous', + ization: 'ize', + ation: 'ate', + ator: 'ate', + alism: 'al', + iveness: 'ive', + fulness: 'ful', + ousness: 'ous', + aliti: 'al', + iviti: 'ive', + biliti: 'ble', + logi: 'log' + }; + + var step3list = { + icate: 'ic', + ative: '', + alize: 'al', + iciti: 'ic', + ical: 'ic', + ful: '', + ness: '' + }; + + var c = "[^aeiou]"; // consonant + var v = "[aeiouy]"; // vowel + var C = c + "[^aeiouy]*"; // consonant sequence + var V = v + "[aeiou]*"; // vowel sequence + + var mgr0 = "^(" + C + ")?" + V + C; // [C]VC... is m>0 + var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1 + var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1 + var s_v = "^(" + C + ")?" + v; // vowel in stem + + this.stemWord = function (w) { + var stem; + var suffix; + var firstch; + var origword = w; + + if (w.length < 3) + return w; + + var re; + var re2; + var re3; + var re4; + + firstch = w.substr(0,1); + if (firstch == "y") + w = firstch.toUpperCase() + w.substr(1); + + // Step 1a + re = /^(.+?)(ss|i)es$/; + re2 = /^(.+?)([^s])s$/; + + if (re.test(w)) + w = w.replace(re,"$1$2"); + else if (re2.test(w)) + w = w.replace(re2,"$1$2"); + + // Step 1b + re = /^(.+?)eed$/; + re2 = /^(.+?)(ed|ing)$/; + if (re.test(w)) { + var fp = re.exec(w); + re = new RegExp(mgr0); + if (re.test(fp[1])) { + re = /.$/; + w = w.replace(re,""); + } + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1]; + re2 = new RegExp(s_v); + if (re2.test(stem)) { + w = stem; + re2 = /(at|bl|iz)$/; + re3 = new RegExp("([^aeiouylsz])\\1$"); + re4 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re2.test(w)) + w = w + "e"; + else if (re3.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + else if (re4.test(w)) + w = w + "e"; + } + } + + // Step 1c + re = /^(.+?)y$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(s_v); + if (re.test(stem)) + w = stem + "i"; + } + + // Step 2 + re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step2list[suffix]; + } + + // Step 3 + re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step3list[suffix]; + } + + // Step 4 + re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; + re2 = /^(.+?)(s|t)(ion)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + if (re.test(stem)) + w = stem; + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1] + fp[2]; + re2 = new RegExp(mgr1); + if (re2.test(stem)) + w = stem; + } + + // Step 5 + re = /^(.+?)e$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + re2 = new RegExp(meq1); + re3 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) + w = stem; + } + re = /ll$/; + re2 = new RegExp(mgr1); + if (re.test(w) && re2.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + + // and turn initial Y back to y + if (firstch == "y") + w = firstch.toLowerCase() + w.substr(1); + return w; + } +} + diff --git a/docs/nightly/fix/reconcile-info/html/_static/minus.png b/docs/nightly/fix/reconcile-info/html/_static/minus.png new file mode 100644 index 0000000000000000000000000000000000000000..d96755fdaf8bb2214971e0db9c1fd3077d7c419d GIT binary patch literal 90 zcmeAS@N?(olHy`uVBq!ia0vp^+#t*WBp7;*Yy1LIik>cxAr*|t7R?Mi>2?kWtu=nj kDsEF_5m^0CR;1wuP-*O&G^0G}KYk!hp00i_>zopr08q^qX#fBK literal 0 HcmV?d00001 diff --git a/docs/nightly/fix/reconcile-info/html/_static/plus.png b/docs/nightly/fix/reconcile-info/html/_static/plus.png new file mode 100644 index 0000000000000000000000000000000000000000..7107cec93a979b9a5f64843235a16651d563ce2d GIT binary patch literal 90 zcmeAS@N?(olHy`uVBq!ia0vp^+#t*WBp7;*Yy1LIik>cxAr*|t7R?Mi>2?kWtu>-2 m3q%Vub%g%s<8sJhVPMczOq}xhg9DJoz~JfX=d#Wzp$Pyb1r*Kz literal 0 HcmV?d00001 diff --git a/docs/nightly/fix/reconcile-info/html/_static/pygments.css b/docs/nightly/fix/reconcile-info/html/_static/pygments.css new file mode 100644 index 00000000..0d49244e --- /dev/null +++ b/docs/nightly/fix/reconcile-info/html/_static/pygments.css @@ -0,0 +1,75 @@ +pre { line-height: 125%; } +td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +.highlight .hll { background-color: #ffffcc } +.highlight { background: #eeffcc; } +.highlight .c { color: #408090; font-style: italic } /* Comment */ +.highlight .err { border: 1px solid #FF0000 } /* Error */ +.highlight .k { color: #007020; font-weight: bold } /* Keyword */ +.highlight .o { color: #666666 } /* Operator */ +.highlight .ch { color: #408090; font-style: italic } /* Comment.Hashbang */ +.highlight .cm { color: #408090; font-style: italic } /* Comment.Multiline */ +.highlight .cp { color: #007020 } /* Comment.Preproc */ +.highlight .cpf { color: #408090; font-style: italic } /* Comment.PreprocFile */ +.highlight .c1 { color: #408090; font-style: italic } /* Comment.Single */ +.highlight .cs { color: #408090; background-color: #fff0f0 } /* Comment.Special */ +.highlight .gd { color: #A00000 } /* Generic.Deleted */ +.highlight .ge { font-style: italic } /* Generic.Emph */ +.highlight .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */ +.highlight .gr { color: #FF0000 } /* Generic.Error */ +.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ +.highlight .gi { color: #00A000 } /* Generic.Inserted */ +.highlight .go { color: #333333 } /* Generic.Output */ +.highlight .gp { color: #c65d09; font-weight: bold } /* Generic.Prompt */ +.highlight .gs { font-weight: bold } /* Generic.Strong */ +.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ +.highlight .gt { color: #0044DD } /* Generic.Traceback */ +.highlight .kc { color: #007020; font-weight: bold } /* Keyword.Constant */ +.highlight .kd { color: #007020; font-weight: bold } /* Keyword.Declaration */ +.highlight .kn { color: #007020; font-weight: bold } /* Keyword.Namespace */ +.highlight .kp { color: #007020 } /* Keyword.Pseudo */ +.highlight .kr { color: #007020; font-weight: bold } /* Keyword.Reserved */ +.highlight .kt { color: #902000 } /* Keyword.Type */ +.highlight .m { color: #208050 } /* Literal.Number */ +.highlight .s { color: #4070a0 } /* Literal.String */ +.highlight .na { color: #4070a0 } /* Name.Attribute */ +.highlight .nb { color: #007020 } /* Name.Builtin */ +.highlight .nc { color: #0e84b5; font-weight: bold } /* Name.Class */ +.highlight .no { color: #60add5 } /* Name.Constant */ +.highlight .nd { color: #555555; font-weight: bold } /* Name.Decorator */ +.highlight .ni { color: #d55537; font-weight: bold } /* Name.Entity */ +.highlight .ne { color: #007020 } /* Name.Exception */ +.highlight .nf { color: #06287e } /* Name.Function */ +.highlight .nl { color: #002070; font-weight: bold } /* Name.Label */ +.highlight .nn { color: #0e84b5; font-weight: bold } /* Name.Namespace */ +.highlight .nt { color: #062873; font-weight: bold } /* Name.Tag */ +.highlight .nv { color: #bb60d5 } /* Name.Variable */ +.highlight .ow { color: #007020; font-weight: bold } /* Operator.Word */ +.highlight .w { color: #bbbbbb } /* Text.Whitespace */ +.highlight .mb { color: #208050 } /* Literal.Number.Bin */ +.highlight .mf { color: #208050 } /* Literal.Number.Float */ +.highlight .mh { color: #208050 } /* Literal.Number.Hex */ +.highlight .mi { color: #208050 } /* Literal.Number.Integer */ +.highlight .mo { color: #208050 } /* Literal.Number.Oct */ +.highlight .sa { color: #4070a0 } /* Literal.String.Affix */ +.highlight .sb { color: #4070a0 } /* Literal.String.Backtick */ +.highlight .sc { color: #4070a0 } /* Literal.String.Char */ +.highlight .dl { color: #4070a0 } /* Literal.String.Delimiter */ +.highlight .sd { color: #4070a0; font-style: italic } /* Literal.String.Doc */ +.highlight .s2 { color: #4070a0 } /* Literal.String.Double */ +.highlight .se { color: #4070a0; font-weight: bold } /* Literal.String.Escape */ +.highlight .sh { color: #4070a0 } /* Literal.String.Heredoc */ +.highlight .si { color: #70a0d0; font-style: italic } /* Literal.String.Interpol */ +.highlight .sx { color: #c65d09 } /* Literal.String.Other */ +.highlight .sr { color: #235388 } /* Literal.String.Regex */ +.highlight .s1 { color: #4070a0 } /* Literal.String.Single */ +.highlight .ss { color: #517918 } /* Literal.String.Symbol */ +.highlight .bp { color: #007020 } /* Name.Builtin.Pseudo */ +.highlight .fm { color: #06287e } /* Name.Function.Magic */ +.highlight .vc { color: #bb60d5 } /* Name.Variable.Class */ +.highlight .vg { color: #bb60d5 } /* Name.Variable.Global */ +.highlight .vi { color: #bb60d5 } /* Name.Variable.Instance */ +.highlight .vm { color: #bb60d5 } /* Name.Variable.Magic */ +.highlight .il { color: #208050 } /* Literal.Number.Integer.Long */ \ No newline at end of file diff --git a/docs/nightly/fix/reconcile-info/html/_static/searchtools.js b/docs/nightly/fix/reconcile-info/html/_static/searchtools.js new file mode 100644 index 00000000..97d56a74 --- /dev/null +++ b/docs/nightly/fix/reconcile-info/html/_static/searchtools.js @@ -0,0 +1,566 @@ +/* + * searchtools.js + * ~~~~~~~~~~~~~~~~ + * + * Sphinx JavaScript utilities for the full-text search. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +/** + * Simple result scoring code. + */ +if (typeof Scorer === "undefined") { + var Scorer = { + // Implement the following function to further tweak the score for each result + // The function takes a result array [docname, title, anchor, descr, score, filename] + // and returns the new score. + /* + score: result => { + const [docname, title, anchor, descr, score, filename] = result + return score + }, + */ + + // query matches the full name of an object + objNameMatch: 11, + // or matches in the last dotted part of the object name + objPartialMatch: 6, + // Additive scores depending on the priority of the object + objPrio: { + 0: 15, // used to be importantResults + 1: 5, // used to be objectResults + 2: -5, // used to be unimportantResults + }, + // Used when the priority is not in the mapping. + objPrioDefault: 0, + + // query found in title + title: 15, + partialTitle: 7, + // query found in terms + term: 5, + partialTerm: 2, + }; +} + +const _removeChildren = (element) => { + while (element && element.lastChild) element.removeChild(element.lastChild); +}; + +/** + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#escaping + */ +const _escapeRegExp = (string) => + string.replace(/[.*+\-?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string + +const _displayItem = (item, searchTerms) => { + const docBuilder = DOCUMENTATION_OPTIONS.BUILDER; + const docUrlRoot = DOCUMENTATION_OPTIONS.URL_ROOT; + const docFileSuffix = DOCUMENTATION_OPTIONS.FILE_SUFFIX; + const docLinkSuffix = DOCUMENTATION_OPTIONS.LINK_SUFFIX; + const showSearchSummary = DOCUMENTATION_OPTIONS.SHOW_SEARCH_SUMMARY; + + const [docName, title, anchor, descr, score, _filename] = item; + + let listItem = document.createElement("li"); + let requestUrl; + let linkUrl; + if (docBuilder === "dirhtml") { + // dirhtml builder + let dirname = docName + "/"; + if (dirname.match(/\/index\/$/)) + dirname = dirname.substring(0, dirname.length - 6); + else if (dirname === "index/") dirname = ""; + requestUrl = docUrlRoot + dirname; + linkUrl = requestUrl; + } else { + // normal html builders + requestUrl = docUrlRoot + docName + docFileSuffix; + linkUrl = docName + docLinkSuffix; + } + let linkEl = listItem.appendChild(document.createElement("a")); + linkEl.href = linkUrl + anchor; + linkEl.dataset.score = score; + linkEl.innerHTML = title; + if (descr) + listItem.appendChild(document.createElement("span")).innerHTML = + " (" + descr + ")"; + else if (showSearchSummary) + fetch(requestUrl) + .then((responseData) => responseData.text()) + .then((data) => { + if (data) + listItem.appendChild( + Search.makeSearchSummary(data, searchTerms) + ); + }); + Search.output.appendChild(listItem); +}; +const _finishSearch = (resultCount) => { + Search.stopPulse(); + Search.title.innerText = _("Search Results"); + if (!resultCount) + Search.status.innerText = Documentation.gettext( + "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories." + ); + else + Search.status.innerText = _( + `Search finished, found ${resultCount} page(s) matching the search query.` + ); +}; +const _displayNextItem = ( + results, + resultCount, + searchTerms +) => { + // results left, load the summary and display it + // this is intended to be dynamic (don't sub resultsCount) + if (results.length) { + _displayItem(results.pop(), searchTerms); + setTimeout( + () => _displayNextItem(results, resultCount, searchTerms), + 5 + ); + } + // search finished, update title and status message + else _finishSearch(resultCount); +}; + +/** + * Default splitQuery function. Can be overridden in ``sphinx.search`` with a + * custom function per language. + * + * The regular expression works by splitting the string on consecutive characters + * that are not Unicode letters, numbers, underscores, or emoji characters. + * This is the same as ``\W+`` in Python, preserving the surrogate pair area. + */ +if (typeof splitQuery === "undefined") { + var splitQuery = (query) => query + .split(/[^\p{Letter}\p{Number}_\p{Emoji_Presentation}]+/gu) + .filter(term => term) // remove remaining empty strings +} + +/** + * Search Module + */ +const Search = { + _index: null, + _queued_query: null, + _pulse_status: -1, + + htmlToText: (htmlString) => { + const htmlElement = new DOMParser().parseFromString(htmlString, 'text/html'); + htmlElement.querySelectorAll(".headerlink").forEach((el) => { el.remove() }); + const docContent = htmlElement.querySelector('[role="main"]'); + if (docContent !== undefined) return docContent.textContent; + console.warn( + "Content block not found. Sphinx search tries to obtain it via '[role=main]'. Could you check your theme or template." + ); + return ""; + }, + + init: () => { + const query = new URLSearchParams(window.location.search).get("q"); + document + .querySelectorAll('input[name="q"]') + .forEach((el) => (el.value = query)); + if (query) Search.performSearch(query); + }, + + loadIndex: (url) => + (document.body.appendChild(document.createElement("script")).src = url), + + setIndex: (index) => { + Search._index = index; + if (Search._queued_query !== null) { + const query = Search._queued_query; + Search._queued_query = null; + Search.query(query); + } + }, + + hasIndex: () => Search._index !== null, + + deferQuery: (query) => (Search._queued_query = query), + + stopPulse: () => (Search._pulse_status = -1), + + startPulse: () => { + if (Search._pulse_status >= 0) return; + + const pulse = () => { + Search._pulse_status = (Search._pulse_status + 1) % 4; + Search.dots.innerText = ".".repeat(Search._pulse_status); + if (Search._pulse_status >= 0) window.setTimeout(pulse, 500); + }; + pulse(); + }, + + /** + * perform a search for something (or wait until index is loaded) + */ + performSearch: (query) => { + // create the required interface elements + const searchText = document.createElement("h2"); + searchText.textContent = _("Searching"); + const searchSummary = document.createElement("p"); + searchSummary.classList.add("search-summary"); + searchSummary.innerText = ""; + const searchList = document.createElement("ul"); + searchList.classList.add("search"); + + const out = document.getElementById("search-results"); + Search.title = out.appendChild(searchText); + Search.dots = Search.title.appendChild(document.createElement("span")); + Search.status = out.appendChild(searchSummary); + Search.output = out.appendChild(searchList); + + const searchProgress = document.getElementById("search-progress"); + // Some themes don't use the search progress node + if (searchProgress) { + searchProgress.innerText = _("Preparing search..."); + } + Search.startPulse(); + + // index already loaded, the browser was quick! + if (Search.hasIndex()) Search.query(query); + else Search.deferQuery(query); + }, + + /** + * execute search (requires search index to be loaded) + */ + query: (query) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + const allTitles = Search._index.alltitles; + const indexEntries = Search._index.indexentries; + + // stem the search terms and add them to the correct list + const stemmer = new Stemmer(); + const searchTerms = new Set(); + const excludedTerms = new Set(); + const highlightTerms = new Set(); + const objectTerms = new Set(splitQuery(query.toLowerCase().trim())); + splitQuery(query.trim()).forEach((queryTerm) => { + const queryTermLower = queryTerm.toLowerCase(); + + // maybe skip this "word" + // stopwords array is from language_data.js + if ( + stopwords.indexOf(queryTermLower) !== -1 || + queryTerm.match(/^\d+$/) + ) + return; + + // stem the word + let word = stemmer.stemWord(queryTermLower); + // select the correct list + if (word[0] === "-") excludedTerms.add(word.substr(1)); + else { + searchTerms.add(word); + highlightTerms.add(queryTermLower); + } + }); + + if (SPHINX_HIGHLIGHT_ENABLED) { // set in sphinx_highlight.js + localStorage.setItem("sphinx_highlight_terms", [...highlightTerms].join(" ")) + } + + // console.debug("SEARCH: searching for:"); + // console.info("required: ", [...searchTerms]); + // console.info("excluded: ", [...excludedTerms]); + + // array of [docname, title, anchor, descr, score, filename] + let results = []; + _removeChildren(document.getElementById("search-progress")); + + const queryLower = query.toLowerCase(); + for (const [title, foundTitles] of Object.entries(allTitles)) { + if (title.toLowerCase().includes(queryLower) && (queryLower.length >= title.length/2)) { + for (const [file, id] of foundTitles) { + let score = Math.round(100 * queryLower.length / title.length) + results.push([ + docNames[file], + titles[file] !== title ? `${titles[file]} > ${title}` : title, + id !== null ? "#" + id : "", + null, + score, + filenames[file], + ]); + } + } + } + + // search for explicit entries in index directives + for (const [entry, foundEntries] of Object.entries(indexEntries)) { + if (entry.includes(queryLower) && (queryLower.length >= entry.length/2)) { + for (const [file, id] of foundEntries) { + let score = Math.round(100 * queryLower.length / entry.length) + results.push([ + docNames[file], + titles[file], + id ? "#" + id : "", + null, + score, + filenames[file], + ]); + } + } + } + + // lookup as object + objectTerms.forEach((term) => + results.push(...Search.performObjectSearch(term, objectTerms)) + ); + + // lookup as search terms in fulltext + results.push(...Search.performTermsSearch(searchTerms, excludedTerms)); + + // let the scorer override scores with a custom scoring function + if (Scorer.score) results.forEach((item) => (item[4] = Scorer.score(item))); + + // now sort the results by score (in opposite order of appearance, since the + // display function below uses pop() to retrieve items) and then + // alphabetically + results.sort((a, b) => { + const leftScore = a[4]; + const rightScore = b[4]; + if (leftScore === rightScore) { + // same score: sort alphabetically + const leftTitle = a[1].toLowerCase(); + const rightTitle = b[1].toLowerCase(); + if (leftTitle === rightTitle) return 0; + return leftTitle > rightTitle ? -1 : 1; // inverted is intentional + } + return leftScore > rightScore ? 1 : -1; + }); + + // remove duplicate search results + // note the reversing of results, so that in the case of duplicates, the highest-scoring entry is kept + let seen = new Set(); + results = results.reverse().reduce((acc, result) => { + let resultStr = result.slice(0, 4).concat([result[5]]).map(v => String(v)).join(','); + if (!seen.has(resultStr)) { + acc.push(result); + seen.add(resultStr); + } + return acc; + }, []); + + results = results.reverse(); + + // for debugging + //Search.lastresults = results.slice(); // a copy + // console.info("search results:", Search.lastresults); + + // print the results + _displayNextItem(results, results.length, searchTerms); + }, + + /** + * search for object names + */ + performObjectSearch: (object, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const objects = Search._index.objects; + const objNames = Search._index.objnames; + const titles = Search._index.titles; + + const results = []; + + const objectSearchCallback = (prefix, match) => { + const name = match[4] + const fullname = (prefix ? prefix + "." : "") + name; + const fullnameLower = fullname.toLowerCase(); + if (fullnameLower.indexOf(object) < 0) return; + + let score = 0; + const parts = fullnameLower.split("."); + + // check for different match types: exact matches of full name or + // "last name" (i.e. last dotted part) + if (fullnameLower === object || parts.slice(-1)[0] === object) + score += Scorer.objNameMatch; + else if (parts.slice(-1)[0].indexOf(object) > -1) + score += Scorer.objPartialMatch; // matches in last name + + const objName = objNames[match[1]][2]; + const title = titles[match[0]]; + + // If more than one term searched for, we require other words to be + // found in the name/title/description + const otherTerms = new Set(objectTerms); + otherTerms.delete(object); + if (otherTerms.size > 0) { + const haystack = `${prefix} ${name} ${objName} ${title}`.toLowerCase(); + if ( + [...otherTerms].some((otherTerm) => haystack.indexOf(otherTerm) < 0) + ) + return; + } + + let anchor = match[3]; + if (anchor === "") anchor = fullname; + else if (anchor === "-") anchor = objNames[match[1]][1] + "-" + fullname; + + const descr = objName + _(", in ") + title; + + // add custom score for some objects according to scorer + if (Scorer.objPrio.hasOwnProperty(match[2])) + score += Scorer.objPrio[match[2]]; + else score += Scorer.objPrioDefault; + + results.push([ + docNames[match[0]], + fullname, + "#" + anchor, + descr, + score, + filenames[match[0]], + ]); + }; + Object.keys(objects).forEach((prefix) => + objects[prefix].forEach((array) => + objectSearchCallback(prefix, array) + ) + ); + return results; + }, + + /** + * search for full-text terms in the index + */ + performTermsSearch: (searchTerms, excludedTerms) => { + // prepare search + const terms = Search._index.terms; + const titleTerms = Search._index.titleterms; + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + + const scoreMap = new Map(); + const fileMap = new Map(); + + // perform the search on the required terms + searchTerms.forEach((word) => { + const files = []; + const arr = [ + { files: terms[word], score: Scorer.term }, + { files: titleTerms[word], score: Scorer.title }, + ]; + // add support for partial matches + if (word.length > 2) { + const escapedWord = _escapeRegExp(word); + Object.keys(terms).forEach((term) => { + if (term.match(escapedWord) && !terms[word]) + arr.push({ files: terms[term], score: Scorer.partialTerm }); + }); + Object.keys(titleTerms).forEach((term) => { + if (term.match(escapedWord) && !titleTerms[word]) + arr.push({ files: titleTerms[word], score: Scorer.partialTitle }); + }); + } + + // no match but word was a required one + if (arr.every((record) => record.files === undefined)) return; + + // found search word in contents + arr.forEach((record) => { + if (record.files === undefined) return; + + let recordFiles = record.files; + if (recordFiles.length === undefined) recordFiles = [recordFiles]; + files.push(...recordFiles); + + // set score for the word in each file + recordFiles.forEach((file) => { + if (!scoreMap.has(file)) scoreMap.set(file, {}); + scoreMap.get(file)[word] = record.score; + }); + }); + + // create the mapping + files.forEach((file) => { + if (fileMap.has(file) && fileMap.get(file).indexOf(word) === -1) + fileMap.get(file).push(word); + else fileMap.set(file, [word]); + }); + }); + + // now check if the files don't contain excluded terms + const results = []; + for (const [file, wordList] of fileMap) { + // check if all requirements are matched + + // as search terms with length < 3 are discarded + const filteredTermCount = [...searchTerms].filter( + (term) => term.length > 2 + ).length; + if ( + wordList.length !== searchTerms.size && + wordList.length !== filteredTermCount + ) + continue; + + // ensure that none of the excluded terms is in the search result + if ( + [...excludedTerms].some( + (term) => + terms[term] === file || + titleTerms[term] === file || + (terms[term] || []).includes(file) || + (titleTerms[term] || []).includes(file) + ) + ) + break; + + // select one (max) score for the file. + const score = Math.max(...wordList.map((w) => scoreMap.get(file)[w])); + // add result to the result list + results.push([ + docNames[file], + titles[file], + "", + null, + score, + filenames[file], + ]); + } + return results; + }, + + /** + * helper function to return a node containing the + * search summary for a given text. keywords is a list + * of stemmed words. + */ + makeSearchSummary: (htmlText, keywords) => { + const text = Search.htmlToText(htmlText); + if (text === "") return null; + + const textLower = text.toLowerCase(); + const actualStartPosition = [...keywords] + .map((k) => textLower.indexOf(k.toLowerCase())) + .filter((i) => i > -1) + .slice(-1)[0]; + const startWithContext = Math.max(actualStartPosition - 120, 0); + + const top = startWithContext === 0 ? "" : "..."; + const tail = startWithContext + 240 < text.length ? "..." : ""; + + let summary = document.createElement("p"); + summary.classList.add("context"); + summary.textContent = top + text.substr(startWithContext, 240).trim() + tail; + + return summary; + }, +}; + +_ready(Search.init); diff --git a/docs/nightly/fix/reconcile-info/html/_static/sidebar.js b/docs/nightly/fix/reconcile-info/html/_static/sidebar.js new file mode 100644 index 00000000..c5e2692c --- /dev/null +++ b/docs/nightly/fix/reconcile-info/html/_static/sidebar.js @@ -0,0 +1,70 @@ +/* + * sidebar.js + * ~~~~~~~~~~ + * + * This script makes the Sphinx sidebar collapsible. + * + * .sphinxsidebar contains .sphinxsidebarwrapper. This script adds + * in .sphixsidebar, after .sphinxsidebarwrapper, the #sidebarbutton + * used to collapse and expand the sidebar. + * + * When the sidebar is collapsed the .sphinxsidebarwrapper is hidden + * and the width of the sidebar and the margin-left of the document + * are decreased. When the sidebar is expanded the opposite happens. + * This script saves a per-browser/per-session cookie used to + * remember the position of the sidebar among the pages. + * Once the browser is closed the cookie is deleted and the position + * reset to the default (expanded). + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +const initialiseSidebar = () => { + + + + + // global elements used by the functions. + const bodyWrapper = document.getElementsByClassName("bodywrapper")[0] + const sidebar = document.getElementsByClassName("sphinxsidebar")[0] + const sidebarWrapper = document.getElementsByClassName('sphinxsidebarwrapper')[0] + const sidebarButton = document.getElementById("sidebarbutton") + const sidebarArrow = sidebarButton.querySelector('span') + + // for some reason, the document has no sidebar; do not run into errors + if (typeof sidebar === "undefined") return; + + const flipArrow = element => element.innerText = (element.innerText === "»") ? "«" : "»" + + const collapse_sidebar = () => { + bodyWrapper.style.marginLeft = ".8em"; + sidebar.style.width = ".8em" + sidebarWrapper.style.display = "none" + flipArrow(sidebarArrow) + sidebarButton.title = _('Expand sidebar') + window.localStorage.setItem("sidebar", "collapsed") + } + + const expand_sidebar = () => { + bodyWrapper.style.marginLeft = "" + sidebar.style.removeProperty("width") + sidebarWrapper.style.display = "" + flipArrow(sidebarArrow) + sidebarButton.title = _('Collapse sidebar') + window.localStorage.setItem("sidebar", "expanded") + } + + sidebarButton.addEventListener("click", () => { + (sidebarWrapper.style.display === "none") ? expand_sidebar() : collapse_sidebar() + }) + + if (!window.localStorage.getItem("sidebar")) return + const value = window.localStorage.getItem("sidebar") + if (value === "collapsed") collapse_sidebar(); + else if (value === "expanded") expand_sidebar(); +} + +if (document.readyState !== "loading") initialiseSidebar() +else document.addEventListener("DOMContentLoaded", initialiseSidebar) \ No newline at end of file diff --git a/docs/nightly/fix/reconcile-info/html/_static/sphinx_highlight.js b/docs/nightly/fix/reconcile-info/html/_static/sphinx_highlight.js new file mode 100644 index 00000000..aae669d7 --- /dev/null +++ b/docs/nightly/fix/reconcile-info/html/_static/sphinx_highlight.js @@ -0,0 +1,144 @@ +/* Highlighting utilities for Sphinx HTML documentation. */ +"use strict"; + +const SPHINX_HIGHLIGHT_ENABLED = true + +/** + * highlight a given string on a node by wrapping it in + * span elements with the given class name. + */ +const _highlight = (node, addItems, text, className) => { + if (node.nodeType === Node.TEXT_NODE) { + const val = node.nodeValue; + const parent = node.parentNode; + const pos = val.toLowerCase().indexOf(text); + if ( + pos >= 0 && + !parent.classList.contains(className) && + !parent.classList.contains("nohighlight") + ) { + let span; + + const closestNode = parent.closest("body, svg, foreignObject"); + const isInSVG = closestNode && closestNode.matches("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.classList.add(className); + } + + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + parent.insertBefore( + span, + parent.insertBefore( + document.createTextNode(val.substr(pos + text.length)), + node.nextSibling + ) + ); + node.nodeValue = val.substr(0, pos); + + if (isInSVG) { + const rect = document.createElementNS( + "http://www.w3.org/2000/svg", + "rect" + ); + const bbox = parent.getBBox(); + rect.x.baseVal.value = bbox.x; + rect.y.baseVal.value = bbox.y; + rect.width.baseVal.value = bbox.width; + rect.height.baseVal.value = bbox.height; + rect.setAttribute("class", className); + addItems.push({ parent: parent, target: rect }); + } + } + } else if (node.matches && !node.matches("button, select, textarea")) { + node.childNodes.forEach((el) => _highlight(el, addItems, text, className)); + } +}; +const _highlightText = (thisNode, text, className) => { + let addItems = []; + _highlight(thisNode, addItems, text, className); + addItems.forEach((obj) => + obj.parent.insertAdjacentElement("beforebegin", obj.target) + ); +}; + +/** + * Small JavaScript module for the documentation. + */ +const SphinxHighlight = { + + /** + * highlight the search words provided in localstorage in the text + */ + highlightSearchWords: () => { + if (!SPHINX_HIGHLIGHT_ENABLED) return; // bail if no highlight + + // get and clear terms from localstorage + const url = new URL(window.location); + const highlight = + localStorage.getItem("sphinx_highlight_terms") + || url.searchParams.get("highlight") + || ""; + localStorage.removeItem("sphinx_highlight_terms") + url.searchParams.delete("highlight"); + window.history.replaceState({}, "", url); + + // get individual terms from highlight string + const terms = highlight.toLowerCase().split(/\s+/).filter(x => x); + if (terms.length === 0) return; // nothing to do + + // There should never be more than one element matching "div.body" + const divBody = document.querySelectorAll("div.body"); + const body = divBody.length ? divBody[0] : document.querySelector("body"); + window.setTimeout(() => { + terms.forEach((term) => _highlightText(body, term, "highlighted")); + }, 10); + + const searchBox = document.getElementById("searchbox"); + if (searchBox === null) return; + searchBox.appendChild( + document + .createRange() + .createContextualFragment( + '" + ) + ); + }, + + /** + * helper function to hide the search marks again + */ + hideSearchWords: () => { + document + .querySelectorAll("#searchbox .highlight-link") + .forEach((el) => el.remove()); + document + .querySelectorAll("span.highlighted") + .forEach((el) => el.classList.remove("highlighted")); + localStorage.removeItem("sphinx_highlight_terms") + }, + + initEscapeListener: () => { + // only install a listener if it is really needed + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.shiftKey || event.altKey || event.ctrlKey || event.metaKey) return; + if (DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS && (event.key === "Escape")) { + SphinxHighlight.hideSearchWords(); + event.preventDefault(); + } + }); + }, +}; + +_ready(SphinxHighlight.highlightSearchWords); +_ready(SphinxHighlight.initEscapeListener); diff --git a/docs/nightly/fix/reconcile-info/html/api.html b/docs/nightly/fix/reconcile-info/html/api.html new file mode 100644 index 00000000..5e724b66 --- /dev/null +++ b/docs/nightly/fix/reconcile-info/html/api.html @@ -0,0 +1,1076 @@ + + + + + + + + API — ESMPy 8.8.0b0 documentation + + + + + + + + + + + + + + +
+
+
+
+ +
+

API

+
+

Classes

+

ESMPy uses a Field object to represent data variables +built on an underlying spatial discretization, which is represented by a +Grid, Mesh or +LocStream. +Regridding between Fields is accomplished with the +Regrid class. All of these classes are explained in +more detail in the sections provided by the links in the following table.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Class

Description

Manager

A manager class to initialize and finalize ESMF

Field

A data field built on a Grid, Mesh, or LocStream

Grid

A class to represent a logically rectangular grid

Mesh

A class to represent an unstructured grid

LocStream

A class to represent observational data as a collection of disconnected points

Regrid

The regridding utility

RegridFromFile

The from file regridding utility

+
+
+

Named Constants

+

ESMPy follows the ESMF convention of using “named constants” to represent the +available options for parameters that expect a variety of specific inputs. The +following table lists the available named constants and provides links to pages +that further explain the available values.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Named constants

Description

CoordSys

Specify the coordinate system of a Grid

ExtrapMethod

Specify the extrapolation method

FileFormat

Specify the format of a data file

FileMode

Specify the mode of a data file

GridItem

Specify a mask or area item on a Grid

LineType

Specify the type of line that connects two points on a sphere

LogKind

Specify how much logging should be done

MeshElemType

Specify the type of the Mesh elements

MeshLoc

Specify a nodal or elemental Mesh

NormType

Specify the type of normalization to use for conservative regridding weights

PoleKind

Specify the type of connection that appears at the poles of the Grid

PoleMethod

Specify which type of artificial pole to construct on the source Grid for regridding

Region

Specify various regions in the data layout of

RegridMethod

Specify which interpolation method to use regridding

StaggerLoc

Specify the position for data in a Grid cell

TypeKind

Specify the type and kind of data

UnmappedAction

Specify which action to take with respect to unmapped destination points

+
+
+

Manager

+

The Manager is used by ESMPy to simplify a +number of low-level calls used by the underlying ESMF framework to allocate +resources, enable logging, and control garbage collection.

+
+

Resource Allocation

+

The ESMF Virtual Machine (VM) +is created at the beginning of each ESMPy execution, and contains information +about the topology and characteristics of the underlying computer. The VM +allocates computational resources in the form of +Persistent Execution Threads, or PETs. These are equivalent to operating +system threads with a lifetime of at least that of the ESMPy execution. In the +simplest, and most common case, a PET is equivalent to an MPI process. The +number of PETs and the current PET can be queried from the +Manager:

+
mg = esmpy.Manager()
+pet_count = mg.pet_count()
+local_pet = mg.local_pet()
+
+
+

Refer to the VM Class of the +ESMF Reference Manual +for more information.

+
+
+

Logging

+

The Manager is also used to enable logging:

+
mg = esmpy.Manager(debug=True)
+local_pet = mg.local_pet
+
+
+

The output will be logged in files named PET<local_pet>.ESMF_LogFile.

+
+
+

Memory management

+

The underlying ESMF framework needs to be initialized and finalized once and +only once per execution. This is handled internally by the +Manager and does not require any explicit +user intervention. However, the ESMF garbage collection feature is not triggered +until the finalization routine is invoked, which may not happen until the +Manager goes out of scope at the end of the +program execution.

+

If memory deallocation of ESMPy +objects is required prior to the end of the program, the class level +destroy routines should be invoked:

+
mg = esmpy.Manager()
+
+mg.destroy()
+
+
+

This is commonly required when reusing a Regrid object +to interpolate data between many Field pairs.

+
+
+

MOAB Mesh backend

+

The Manager can be used to enable the MOAB +mesh backend to the Mesh.

+
mg.set_moab(moab_on=True)
+
+
+

The MOAB mesh is an alternative to the native ESMF mesh, and does not yet have +full support.

+
+
+
+

Spatial Discretization Objects

+

There are three different objects used for spatial coordinate representation: +Grid, Mesh, and LocStream. Grids are used to represent logically rectangular +grids, Meshes are used for unstructured collections of polygons, and +LocStreams are used for unstructured collections of individual points. These +objects are nearly identical counterparts to the objects of the same name in +ESMF, with some simplifications for ease of use in the Python environment.

+
+

Grid

+

The Grid is used to represent the geometry and discretization of logically +rectangular physical grids. The Grid can also hold information that can used in +calculations involving the Grid, like a mask or the cell areas. Refer to the Grid Class of the +ESMF Reference Manual for more information.

+
+

Staggering

+

Staggering is a finite difference technique in which the values of different +physical quantities are placed at different locations within a grid cell.

+

The ESMF Grid class supports a variety of stagger locations, including cell +centers, corners, and edge centers. The default stagger location in ESMF is the +cell center, and cell counts in Grid are based on this assumption. Combinations +of the 2D ESMF stagger locations are sufficient to specify any of the Arakawa +staggers. ESMF also supports staggering in 3D and higher dimensions. There are +shortcuts for standard staggers, and interfaces through which users can create +custom staggers.

+

As a default the ESMF Grid class provides symmetric staggering, so that cell +centers are enclosed by cell perimeter (e.g. corner) stagger locations. This +means the coordinate arrays for stagger locations other than the center will +have an additional element of padding in order to enclose the cell center +locations. However, to achieve other types of staggering, the user may alter or +eliminate this padding by using the appropriate options when adding coordinates +to a Grid.

+

Grid staggers are indicated using +StaggerLoc.

+
grid = esmpy.Grid(np.array([3,4]), staggerloc=esmpy.StaggerLoc.CENTER)
+
+
+
+
+

Spherical Coordinates

+

In the case that the Grid is on a sphere (coord_sys = esmpy.api.constants.CoordSys.SPH_DEG or +esmpy.api.constants.CoordSys.SPH_RAD) then the coordinates given in the Grid are interpreted +as latitude and longitude values. The coordinates can either be in degrees or +radians as indicated by the coord_sys flag set during Grid creation. As is +true with many global models, this application currently assumes the latitude +and longitude refer to positions on a perfect sphere.

+

The Grid coordinate system is represented using +CoordSys.

+
grid = esmpy.Grid(np.array([3,4]), staggerloc=esmpy.StaggerLoc.CENTER,
+                    coord_sys=esmpy.CoordSys.SPH_DEG)
+
+
+
+
+

Periodicity

+

A periodic connection can be specified when building Grids in spherical +coordinates. The num_peri_dims parameter indicates the total number of +periodic dimensions and periodic_dim is used to identify which dimensions +should be considered periodic. There must always be at least one non-periodic +dimension. For example, to create a global latitude-longitude Grid there would +be one periodic dimension, dimension 0 (longitude).

+
grid = esmpy.Grid(np.array([3,4]), staggerloc=esmpy.StaggerLoc.CENTER,
+                    coord_sys=esmpy.CoordSys.SPH_DEG,
+                    num_peri_dims=1, periodic_dim=0)
+
+
+
+
+

Pole Generation

+

The Grid can generate an artificial pole by using the pole_dim parameter. This +can be helpful for regridding operations to smooth out the interpolated values +in the polar region. For the example of creating a global latitude-longitude +Grid, the pole dimension would be 1 (latitude).

+
grid = esmpy.Grid(np.array([3,4]), staggerloc=esmpy.StaggerLoc.CENTER,
+                    coord_sys=esmpy.CoordSys.SPH_DEG,
+                    num_peri_dims=1, periodic_dim=0, pole_dim=1)
+
+
+
+
+

Masking

+

Masking is the process used to mark parts of a Grid to be ignored during an +operation. Marking Grid cells as masked can affect the Field values that are +represented by those cells. Masking is specified by assigning an integer value +to a Grid cell. This allows many different masks to be defined on the same Grid, +any combination of which may be also activated on the Field by specifying the +corresponding integer values. The activation of Field masks with respect to the +underlying Grid mask is handled by Regrid, and a more +general discussion of masking is covered in the masking +section.

+
In [1]: import numpy as np
+   ...: import esmpy
+   ...: grid = esmpy.Grid(np.array([3,4]), staggerloc=esmpy.StaggerLoc.CENTER,
+   ...:                                coord_sys=esmpy.CoordSys.SPH_DEG,
+   ...:                                num_peri_dims=1, periodic_dim=0, pole_dim=1)
+   ...:
+   ...: mask = grid.add_item(esmpy.GridItem.MASK, staggerloc=esmpy.StaggerLoc.CENTER)
+   ...: mask
+   ...:
+Out[1]:
+array([[1, 1, 1, 1],
+       [1, 1, 1, 1],
+       [1, 1, 1, 1]], dtype=int32)
+
+
+
+
+

Cell Areas

+

Grid cell areas can be calculated by ESMPy. Space must first be allocated for +this calculation by adding an +AREA item to the Grid. +Then a Field must be created, and the +get_area() function called.

+
+

Note

+

The Grid area calculation assumes the Grid is a unit sphere.

+
+

Grid cell areas may also be set to user-defined values +after the AREA item has +been allocated and retrieved using get_item().

+
In [1]: grid = esmpy.Grid(np.array([3,4]), staggerloc=[esmpy.StaggerLoc.CENTER, esmpy.StaggerLoc.CORNER],
+   ...:                  coord_sys=esmpy.CoordSys.SPH_DEG,
+   ...:                  num_peri_dims=1, periodic_dim=0, pole_dim=1)
+   ...:
+   ...:
+   ...: gridLon = grid.get_coords(0)
+   ...: gridLat = grid.get_coords(1)
+   ...: gridLonCorner = grid.get_coords(0, staggerloc=esmpy.StaggerLoc.CORNER)
+   ...: gridLatCorner = grid.get_coords(1, staggerloc=esmpy.StaggerLoc.CORNER)
+   ...:
+   ...: lon = np.linspace(-120,120,3)
+   ...: lat = np.linspace(-67.5, 67.5,4)
+   ...: lon_corner = np.arange(-180,180,120)
+   ...: lat_corner = np.linspace(-90, 90, 5)
+   ...:
+   ...: lonm, latm = np.meshgrid(lon, lat, indexing='ij')
+   ...: lonm_corner, latm_corner = np.meshgrid(lon_corner, lat_corner, indexing='ij')
+   ...:
+   ...: gridLon[:] = lonm
+   ...: gridLat[:] = latm
+   ...: gridLonCorner[:] = lonm_corner
+   ...: gridLatCorner[:] = latm_corner
+   ...:
+   ...: field = esmpy.Field(grid)
+   ...: field.get_area()
+   ...: field.data
+   ...:
+Out[1]:
+array([[ 0.32224085,  1.02707409,  1.02707409,  0.32224085],
+       [ 0.32224085,  1.02707409,  1.02707409,  0.32224085],
+       [ 0.32224085,  1.02707409,  1.02707409,  0.32224085]])
+
+
+
+
+
+

Mesh

+

A Mesh is an object for representing unstructured grids. +Refer to the Mesh Class of the +ESMF Reference Manual +for more information.

+

A Mesh is constructed of nodes and elements. A node, also known as a vertex +or corner, is a part of a Mesh which represents a single point. An element, +also known as a cell, is a part of a Mesh which represents a small +region of space. Elements are described in terms of a connected set of nodes +which represent locations along their boundaries.

+

Field data may be located on either the nodes or elements of a Mesh. Fields +created on a Mesh can also be used as either the source or destination or both +of a regridding operation.

+

The dimension of a Mesh in ESMF is specified with two parameters: the +parametric dimension and the spatial dimension.

+

The parametric dimension of a Mesh is the dimension of the topology of the Mesh. +This can be thought of as the dimension of the elements which make up the Mesh. +For example, a Mesh composed of triangles would have a parametric dimension of +2, and a Mesh composed of tetrahedra would have a parametric dimension of 3.

+

The spatial dimension of a Mesh is the dimension of the space in which the Mesh +is embedded. In other words, it is the number of coordinate dimensions needed to +describe the location of the nodes making up the Mesh.

+

For example, a Mesh constructed of squares on a plane would have a parametric +dimension of 2 and a spatial dimension of 2. If that same Mesh were used to +represent the 2D surface of a sphere, then the Mesh would still have a +parametric dimension of 2, but now its spatial dimension would be 3.

+

Only Meshes whose number of coordinate dimensions (spatial dimension) is 2 or 3 +are supported. The dimension of the elements in a Mesh (parametric dimension) must +be less than or equal to the spatial dimension, but also must be either 2 or 3. +This means that a Mesh may be either 2D elements in 2D space, 3D elements in 3D +space, or a manifold constructed of 2D elements embedded in 3D space.

+

For a parametric dimension of 2, the native supported element types are +triangles and quadrilaterals. In addition to these, ESMF supports 2D polygons +with any number of sides. Internally these are represented as sets of triangles, +but to the user should behave like any other element. For a parametric dimension +of 3, the supported element types are tetrahedrons and hexahedrons. The Mesh +supports any combination of element types within a particular dimension, but +types from different dimensions may not be mixed. For example, a Mesh cannot be +constructed of both quadrilaterals and tetrahedra.

+
+

Mesh Creation

+

To create a Mesh we need to set some properties of the Mesh as a whole, some +properties of each node in the Mesh and then some properties of each element +which connects the nodes.

+

For the Mesh as a whole we set its parametric dimension and spatial dimension. +A Mesh's parametric dimension can be thought of as the dimension of the elements +which make up the Mesh. A Mesh's spatial dimension, on the other hand, is the +number of coordinate dimensions needed to describe the location of the nodes +making up the Mesh.

+

The structure of the per node and element information used to create a Mesh is +influenced by the Mesh distribution strategy. The Mesh class is distributed by +elements. This means that a node must be present on any PET that contains +an element associated with that node, but not on any other PET (a node +can’t be on a PET without an element “home”). Since a node may be used by +two or more elements located on different PETs, a node may be duplicated +on multiple PETs. When a node is duplicated in this manner, one and only +one of the PETs that contain the node must “own” the node. The user sets +this ownership when they define the nodes during Mesh +creation. When a Field is created on a +Mesh (i.e. on the Mesh nodes), +on each PET the Field is only +created on the nodes which are owned by that PET. This means that the size +of the Field memory on the PET can be smaller than the +number of nodes used to create the Mesh on that PET.

+

Three properties need to be defined for each Mesh node: the global id of the node +(node_ids), node coordinates (node_coords), and which PET owns the node +(node_owners). The node id is a unique (across all PETs) integer attached +to the particular node. It is used to indicate which nodes are the same when +connecting together pieces of the Mesh on different PETs. The node +coordinates indicate the location of a node in space and are used in the Regrid +functionality when interpolating. The node owner indicates which PET is in +charge of the node. This is used when creating a Field on the Mesh to indicate +which PET should contain a Field location for the data.

+

Three properties need to be defined for each Mesh element: the global id of the +element (element_ids), the topology type of the element (element_types), and +which nodes are connected together to form the element (element_conn). The +element id is a unique (across all PETs) integer attached to the +particular element. The element type describes the topology of the element +(e.g. a triangle vs. a quadrilateral). The range of choices for the topology of +the elements in a Mesh are restricted by the Mesh's parametric dimension (e.g. a +Mesh can’t contain a 2D element like a triangle, when its parametric dimension +is 3D), but it can contain any combination of elements appropriate to its +dimension. In particular, in 2D ESMF supports two native element types triangle +and quadrilateral, but also provides support for polygons with any number of +sides. These polygons are represented internally as sets of triangles, but to +the user should behave like other elements. To specify a polygon with more than +four sides, the element type should be set to the number of corners of the +polygon (e.g. element type=6 for a hexagon). The element connectivity indicates +which nodes are to be connected together to form the element. The number of +nodes connected together for each element is implied by the elements topology +type (element_types). It is IMPORTANT to note, that the entries in this list are +NOT the global ids of the nodes, but are indices into the PET local lists +of node info used in the Mesh creation. In other words, the element connectivity +isn’t specified in terms of the global list of nodes, but instead is specified +in terms of the locally described node info. One other important point about +connectivities is that the order of the nodes in the connectivity list of an +element is important. In general, when specifying an element with parametric +dimension 2, the nodes should be given in counterclockwise order around the +element.

+

The three step Mesh creation process starts with a call to the Mesh constructor. +It is then followed by the add_nodes() call to +specify nodes, and then the add_elements() call to +specify elements.

+
#  2.5        8        10 --------11
+#          /     \   /            |
+#  2.1   7         9              12
+#        |         |      5       /
+#        |    4    |            /
+#        |         |          /
+#  1.0   4 ------- 5 ------- 6
+#        |         |  \   3  |
+#        |    1    |    \    |
+#        |         |  2   \  |
+# -0.1   1 ------- 2 ------- 3
+#
+#      -0.1       1.0       2.1   2.5
+#
+#          Node Ids at corners
+#          Element Ids in centers
+
+# Two parametric dimensions, and two spatial dimensions
+mesh = esmpy.Mesh(parametric_dim=2, spatial_dim=2, coord_sys=coord_sys)
+
+num_node = 12
+num_elem = 5
+nodeId = np.array([1,2,3,4,5,6,7,8,9,10,11,12])
+nodeCoord = np.array([-0.1,-0.1,  #node id 1
+                      1.0,-0.1,  #node id 2
+                      2.1,-0.1,  #node id 3
+                      0.1, 1.0,  #node id 4
+                      1.0, 1.0,  #node id 5
+                      2.1, 1.0,  #node id 6
+                      0.1, 2.1,  #node id 7
+                      0.5, 2.5,  #node id 8
+                      1.0, 2.1,  #node id 9
+                      1.5, 2.5,  #node id 10
+                      2.5, 2.5,  #node id 11
+                      2.5, 2.1]) #node id 12
+
+
+nodeOwner = np.zeros(num_node)
+
+elemId = np.array([1,2,3,4,5])
+elemType=np.array([esmpy.MeshElemType.QUAD,
+                   esmpy.MeshElemType.TRI,
+                   esmpy.MeshElemType.TRI, 5, 6])
+
+elemConn=np.array([0,1,4,3,         # elem id 1
+                   1,2,4,           # elem id 2
+                   2,5,4,           # elem id 3
+                   3,4,8,7,6,       # elem id 4
+                   4,5,11,10,9,8])  # elem id 5
+
+mesh.add_nodes(num_node,nodeId,nodeCoord,nodeOwner)
+
+mesh.add_elements(num_elem,elemId,elemType,elemConn)
+
+
+
+
+

Masking

+

There are two types of masking available in Mesh: node masking and element +masking. These both work in a similar manner, but vary slightly in the details +of setting the mask information during Mesh creation.

+

For node masking, the mask information is set using the node_mask parameter. +When a Regrid object is created the mask values arguments src_mask_values and +dst_mask_values can then be used to indicate which particular values set in +the node_mask array indicate that the node should be masked. For example, if +dst_mask_values has been set to 1, then any node in the destination Mesh whose +corresponding node_mask value is 1 will be masked out (a node with any other +value than 1 will not be masked).

+

For element masking, the mask information is set using the element_mask +parameter when adding elements to the Mesh. In a similar manner to node masking, +the mask values parameters to Regrid, src_mask_values and dst_mask_values +can then be used to indicate which particular values set in the element_mask +array indicate that the element should be masked. For example, if +dst_mask_values has been set to 1, then any element in the destination Mesh +whose corresponding element_mask value is 1 will be masked out (an element +with any other value than 1 will not be masked).

+
+
+

Areas

+

Mesh cell areas can be specified using the element_areas parameter to +add_elements().

+

If cell areas are not specified by the user they can be calculated by ESMPy +using get_area().

+
+
+
+

LocStream

+

A LocStream can be used to represent the locations of a set of +data points. For example, in the data assimilation world, LocStreams can be used +to represent a set of observations. The values of the data points are stored +within a Field created using the LocStream. +Refer to the LocStream Class of the +ESMF Reference Manual +for more information.

+

The locations are generally described using Cartesian (x, y, z), or +(lat, lon, radius) coordinates. The coordinates are stored using constructs +called keys. A key is essentially a list of point descriptors, one for each data +point. They may hold other information besides the coordinates - a mask, for +example. They may also hold a second set of coordinates. Keys are referenced by +name. Each key must contain the same number of elements as there are data points +in the LocStream. While there is no assumption in the ordering of the points, +the order chosen must be maintained in each of the keys.

+

A LocStream can be very large. Data assimilation systems might use LocStreams +with up to 10^8 observations, so efficiency is critical. LocStreams can be +created from file.

+

A LocStream is similar to a Mesh in that both are collections of irregularly +positioned points. However, the two structures differ because a Mesh also has +connectivity: each data point represents either a center or corner of a cell. +There is no requirement that the points in a LocStream have connectivity, in +fact there is no requirement that any two points have any particular spatial +relationship at all.

+
locstream = esmpy.LocStream(16, coord_sys=coord_sys)
+
+deg_rad = pi
+if coord_sys == esmpy.CoordSys.SPH_DEG:
+    deg_rad = 180
+
+locstream["ESMF:Lon"] = [0.0, 0.5*deg_rad, 1.5*deg_rad, 2*deg_rad, 0.0, 0.5*deg_rad, 1.5*deg_rad, 2*deg_rad, 0.0, 0.5*deg_rad, 1.5*deg_rad, 2*deg_rad, 0.0, 0.5*deg_rad, 1.5*deg_rad, 2*deg_rad]
+locstream["ESMF:Lat"] = [deg_rad/-2.0, deg_rad/-2.0, deg_rad/-2.0, deg_rad/-2.0, -0.25*deg_rad, -0.25*deg_rad, -0.25*deg_rad, -0.25*deg_rad, 0.25*deg_rad, 0.25*deg_rad, 0.25*deg_rad, 0.25*deg_rad, deg_rad/2.0, deg_rad/2.0, deg_rad/2.0, deg_rad/2.0]
+if domask:
+    locstream["ESMF:Mask"] = np.array([1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], dtype=np.int32)
+
+
+
+
+
+

Create a Grid or Mesh from File

+
+

File Formats

+

ESMPy can create Grid or Mesh objects from NetCDF files in a variety +of formats. A Mesh can be created from files in SCRIP, ESMFMESH, and UGRID +formats. Grid files can be in SCRIP and GRIDSPEC format.

+
+

SCRIP

+

This file format is used by the SCRIP [1], package, grid files that +work with that package should also work here. SCRIP format files are +capable of storing either 2D logically rectangular grids or 2D +unstructured grids. More information can be found in the +ESMF Reference Manual.

+
+
+

ESMFMESH

+

ESMF has a custom unstructured grid file format for describing Meshes. +This format is more compatible than the SCRIP format with the methods +used to create a Mesh object, so less conversion needs to be done to +create a Mesh. The ESMFMESH format is thus more efficient than SCRIP when +used with ESMPy. More information can be found in the +ESMF Reference Manual.

+
+
+

GRIDSPEC

+

GRIDSPEC is an extension to the Climate and Forecast (CF) metadata +conventions for the representation of gridded data for Earth System +Models. ESMPy supports NetCDF files that follow the CF GRIDSPEC +convention to support logically rectangular lat/lon grids. More +information can be found in the +ESMF Reference Manual.

+
+
+

UGRID

+

UGRID is an extension to the CF metadata +conventions for the unstructured grid data model. ESMPy support +NetCDF files that follow the CF UGRID convention for unstructured grids. +More information can be found in the +ESMF Reference Manual.

+
+
+
+

Meshes from File

+

When creating a Mesh from a SCRIP format file, there are a number of +options to control the output Mesh. The data is located at the center +of the grid cell in a SCRIP grid. Therefore, when the Mesh will be +part of a conservative regridding operation, the convert_to_dual +flag must be set to True to properly generate coordinates at the the +cell corners.

+

A Mesh may also be created with boolean flags to specify whether or not to +add an area property to the Mesh add_user_area, or to add a mask +add_mask held by the NetCDF variable indicated in the optional argument, +varname. These argument are only valid for UGRID formatted files. +The mask generated for a Mesh created from file will +have 0 for the masked values and 1 for the unmasked values.

+
+
+

Grids from File

+

A number of optional boolean arguments are also supported to create a +structured Grid from a file. These include is_sphere to indicate whether +the grid is spherical or regional, add_corner_stagger to add the corner +stagger information to the Grid for conservative regridding, and +add_user_area to specify whether to read in the cell area from the +NetCDF file or to calculate them.

+

For GRIDSPEC formated files +there is the add_mask optional argument +to add a mask held by the NetCDF variable indicated in optional +argument, varname, and the coord_names argument to specify the longitude +and latitude variable names in a GRIDSPEC file containing multiple sets of +coordinates.

+

For SCRIP formated files the integer array grid_imask is used to mask out grid cells which should not participate in the regridding.

+

The mask generated for a Grid created from +file (any format) will have 0 for the masked values and 1 for the unmasked values.

+
+
+
+

Regridding

+

The following table describe the regridding methods and options that are +available in ESMPy, the flag that is required to use it and a short description. +More information can be found on these options in the +ESMF Reference Manual.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Class

Description

BILINEAR

Linear regridding in two dimensions

PATCH

Higher-order least squares method

NEAREST_STOD

Nearest source point used for each destination

NEAREST_DTOS

Nearest destination point used for each source

CONSERVE

First-order conservative

CONSERVE_2ND

Second-order conservative

NormType

Normalization options for integral conservation

LineType

Line types for spherical and Cartesian space

UnmappedAction

Unmapped destination point handling options

CoordSys

Spherical grids and pole handling

+
+

Great Circle Cells

+

For Grids and Meshes on a sphere some combinations of interpolation options +(e.g. first and second-order conservative methods) use cells whose edges are +great circles. This section describes some behavior that the user may not expect +from these cells and some potential solutions. A great circle edge isn’t +necessarily the same as a straight line in latitude longitude space. For small +edges, this difference will be small, but for long edges it could be +significant. This means if the user expects cell edges as straight lines in +latitude longitude space, they should avoid using one large cell with long edges +to compute an average over a region (e.g. over an ocean basin).

+

Also, the user should also avoid using cells that contain one edge that runs +half way or more around the earth, because the regrid weight calculation assumes +the edge follows the shorter great circle path. There isn’t a unique great +circle edge defined between points on the exact opposite side of the earth from +one another (antipodal points). However, the user can work around both of these +problem by breaking the long edge into two smaller edges by inserting an extra +node, or by breaking the large target grid cells into two or more smaller grid +cells. This allows the application to resolve the ambiguity in edge direction.

+
+
+
+

Masking

+

Masking is the process whereby parts of a Grid, Mesh or LocStream can be marked to be ignored +during an operation, such as when they are used in regridding. Masking can be used on a Field +created from a regridding source to indicate that certain portions should not be used to generate +regridded data. This is useful, for example, if a portion of the source contains unusable values. +Masking can also be used on a Field created from a regridding destination to indicate that a certain +portion should not receive regridded data. This is useful, for example, when part of the destination +isn’t being used (e.g. the land portion of an ocean grid).

+

The user may mask out points in the source Field or destination Field or both. To do masking the user +sets mask information in the Grid, Mesh, or LocStream upon +which the Fields passed into the Regrid call are built. The src_mask_values and +dst_mask_values arguments to that call can then be used to specify which values in that mask information +indicate that a location should be masked out. For example, if dst_mask_values is set to [1,2], then any +location that has a value of 1 or 2 in the mask information of the Grid, Mesh or LocStream upon which +the destination Field is built will be masked out.

+

Masking behavior differs slightly between regridding methods. For non-conservative regridding methods +(e.g. bilinear or high-order patch), masking is done on points. For these methods, masking a destination +point means that the point will not participate in regridding. For these +methods, masking a source point means that the entire source cell using that point is masked out. +In other words, if any corner point making up a source cell is masked then the cell is masked. +For conservative regridding methods masking is done on cells. +Masking a destination cell means that the cell won’t participate in regridding. +Similarly, masking a source cell means that the cell won’t participate in regridding. +For any type of interpolation method (conservative or non-conservative) +the masking is set on the location upon which the +Fields passed into the regridding call are built. +For example, if Fields built on +StaggerLoc.CENTER are passed into +Regrid +then the masking should also be set on StaggerLoc.CENTER.

+

The mask generated for a Grid, +Mesh or LocStream created +from file will have 0 for the masked values and 1 for the unmasked values.

+
+

Note

+

The Region.SELECT flag to the

+
+

zero_region parameter of Regrid can be used to +maintain Fields values on locations that do not +participate in the regridding operation. This is useful when setting an +uninitialized value to help identify masked locations within the +Fields data.

+
+
+

Numpy Slicing and Indexing

+

Numpy arrays are used to represent Grid, Mesh and LocStream coordinates and Field data, +among other things. Standard numpy conventions for array indexing +and slicing can be expected. There are some exceptions when it comes to fancy +indexing, index arrays, and multi-dimensional slicing. Significant effort has +been put into raising exceptions where inappropriate indexing or slicing +operations are attempted.

+

It is very important to remember that all indexing +and slicing operations apply ONLY to the ESMPy level objects, and these operations +do not propagate down to the lower-level Fortran- and C-based representations +of the ESMF objects. One example of where this could come up is when passing +a Field slice into regridding. The entire original Field will still be run +through the ESMF regridding engine, and only the appropriate portion of +the Field slice will be updated with the regridded values.

+
+

Dimension Ordering

+
+

Warning

+

The underlying ESMF library is built with a mix of Fortran and C/C++ +and follows Fortran conventions with respect to array indexing and +dimension ordering. Some effort has been made to make ESMPy feel more +natural to the Python user where possible. This means that ESMPy uses +0-based indexing, which is translated to the 1-based indexing used by +the ESMPy backend. The only exception to this is NetCDF files that are +generated by ESMPy will continue to use the 1-based indexing from the +underlying ESMF code. Likewise, the dimension ordering still follows +Fortran conventions. This means that longitude comes before latitude, which +also comes before temporal dimensions, when in use.

+
In [1]: import numpy as np
+   ...: import esmpy
+   ...:
+   ...: grid = esmpy.Grid(np.array([3,4]), staggerloc=esmpy.StaggerLoc.CENTER)
+   ...:
+   ...: gridLon = grid.get_coords(0)
+   ...: gridLat = grid.get_coords(1)
+   ...:
+   ...: lon = np.linspace(-120,120,3)
+   ...: lat = np.linspace(-67.5, 67.5,4)
+   ...:
+   ...: lonm, latm = np.meshgrid(lon, lat, indexing='ij')
+   ...:
+   ...: gridLon[:] = lonm
+   ...: gridLat[:] = latm
+   ...:
+
+In [2]: grid.coords[esmpy.StaggerLoc.CENTER][0].shape
+Out[2]: (3, 4)
+
+In [3]: lon.shape
+Out[3]: (3,)
+
+In [4]: lat.shape
+Out[4]: (4,)
+
+In [5]: grid.coords[esmpy.StaggerLoc.CENTER][0]
+Out[5]:
+array([[-120., -120., -120., -120.],
+       [   0.,    0.,    0.,    0.],
+       [ 120.,  120.,  120.,  120.]])
+
+In [6]: grid.coords[esmpy.StaggerLoc.CENTER][1]
+Out[6]:
+array([[-67.5, -22.5,  22.5,  67.5],
+       [-67.5, -22.5,  22.5,  67.5],
+       [-67.5, -22.5,  22.5,  67.5]])
+
+In [7]: field = esmpy.Field(grid, ndbounds=[10]) # create a Field with a time dimension
+
+In [8]: field.data.shape
+Out[8]: (3, 4, 10)
+
+
+
+
+
+
+

Parallel Execution

+

ESMPy is a thin wrapper on top of ESMF, which was designed for high performance +and scalable computing. The ESMF virtual machine is used to manage the available +resources of the execution environment in a layer that is transparent to the +ESMPy user. This allows the full power of the high performance computing +environment to be utilized by the ESMPy user with little use of specialized +parallel programming techniques.

+

ESMPy objects will be distributed across the available computing resources with +no additional parameters required. The Grid, Mesh, LocStream, and Field classes +will all be transparently “parallelized” with no need for user calls to a +message passing interface. Likewise, the Regrid class will compute and apply +the interpolation weights using all available computing resources with no need +for user intervention.

+

However, it is useful to remember that resulting Field values will only be +accessible on certain PETs. The mpi4py package may be necessary for post +processing tasks that require access to global Field values.

+
+

mpirun vs. MPI.Spawn

+

There are a few different options for using ESMPy in a parallel +environment. Using mpirun to specify the desired number of computing cores +is probably the easiest way to start a parallel ESMPy job. Another option is to +call the MPI.Spawn() function from the mpi4py Python package from within a +serial Python script or interpreter. It has been observed that MPI.Spawn() may +not work properly when mpi4py is built with an underlying mpich +library, openmpi has seen better success. A third option is to call mpirun +using a system call from within a serial Python script or interpreter, however +this method is not highly recommended.

+

The following two examples demonstrate how to execute an ESMPy script in +parallel. Any of the scripts found in the examples directory of the ESMPy source +code can be run in parallel using mpirun as well as in serial mode.

+
+

mpirun

+
mpirun -n 4 python hello_world.py
+
+
+
+
+

MPI.Spawn

+
import sys
+from mpi4py import MPI
+
+# Parent
+if len(sys.argv) == 1:
+
+    # Spawn workers
+    comm = MPI.COMM_WORLD.Spawn(
+        sys.executable,
+        args=[sys.argv[0], 'worker'],
+        maxprocs=4)
+
+    # Shutdown
+    comm.Disconnect()
+
+# Worker
+elif sys.argv[1] == 'worker':
+
+    # Connect to parent
+    try:
+        comm = MPI.Comm.Get_parent()
+        rank = comm.Get_rank()
+    except:
+        raise ValueError('Could not connect to parent - ' + usage)
+
+    # worker code goes here, regridding etc..
+    print "Hello World from PET #"+str(rank)
+
+    # Shutdown
+    comm.Disconnect()
+
+# Catch
+else:
+    raise ValueError('Program should be started without arguments')
+
+
+

A more detailed example of using MPI.Spawn() can be found in the Tutorials section +of the documentation.

+
+
+
+
+ + +
+
+
+
+ +
+
+ + + + \ No newline at end of file diff --git a/docs/nightly/fix/reconcile-info/html/appendix.html b/docs/nightly/fix/reconcile-info/html/appendix.html new file mode 100644 index 00000000..7eb4a31f --- /dev/null +++ b/docs/nightly/fix/reconcile-info/html/appendix.html @@ -0,0 +1,425 @@ + + + + + + + + Appendices — ESMPy 8.8.0b0 documentation + + + + + + + + + + + + + + +
+
+
+
+ +
+

Appendices

+
+

Class APIs

+ +
+
+

Named Constants

+
+ +
+
+
+

References

+
+
+
+[1] +

SCRIP: A Spherical Coordinate Remapping and Interpolation Package. http://oceans11.lanl.gov/trac/SCRIP, last accessed on Dec 4, 2015. Los Alamos Software Release LACC 98-45.

+
+
+
+
+
+ + +
+
+
+
+ +
+
+ + + + \ No newline at end of file diff --git a/docs/nightly/fix/reconcile-info/html/examples.html b/docs/nightly/fix/reconcile-info/html/examples.html new file mode 100644 index 00000000..ca0f7c77 --- /dev/null +++ b/docs/nightly/fix/reconcile-info/html/examples.html @@ -0,0 +1,1298 @@ + + + + + + + + Tutorials — ESMPy 8.8.0b0 documentation + + + + + + + + + + + + + + +
+
+
+
+ +
+

Tutorials

+
+

Hello World

+
+
import esmpy
+
+# This call enables debug logging
+# esmpy = esmpy.Manager(debug=True)
+
+print ("Hello ESMPy World from PET (processor) {0}!".format(esmpy.local_pet()))
+
+
+
+
+
+

Regridding Helper Functions

+

The following code snippets demonstrate how to build all of the pieces +necessary to regrid data between Fields built on +Grids, Meshes +and LocStreams.

+
+

LocStream Create

+
def create_locstream_spherical_16(coord_sys=esmpy.CoordSys.SPH_DEG, domask=False):
+    """
+    :param coord_sys: the coordinate system of the LocStream
+    :param domask: a boolean to tell whether or not to add a mask
+    :return: LocStream
+    """
+    if esmpy.pet_count() != 1:
+        raise ValueError("processor count must be 1 to use this function")
+
+    locstream = esmpy.LocStream(16, coord_sys=coord_sys)
+
+    deg_rad = pi
+    if coord_sys == esmpy.CoordSys.SPH_DEG:
+        deg_rad = 180
+
+    locstream["ESMF:Lon"] = [0.2*deg_rad, 0.5*deg_rad, 1.5*deg_rad, 1.8*deg_rad, 0.2*deg_rad, 0.5*deg_rad, 1.5*deg_rad, 1.8*deg_rad, 0.2*deg_rad, 0.5*deg_rad, 1.5*deg_rad, 1.8*deg_rad, 0.2*deg_rad, 0.5*deg_rad, 1.5*deg_rad, 1.8*deg_rad]
+    locstream["ESMF:Lat"] = [-0.4*deg_rad, -0.4*deg_rad, -0.4*deg_rad, -0.4*deg_rad, -0.25*deg_rad, -0.25*deg_rad, -0.25*deg_rad, -0.25*deg_rad, 0.25*deg_rad, 0.25*deg_rad, 0.25*deg_rad, 0.25*deg_rad, 0.4*deg_rad, 0.4*deg_rad, 0.4*deg_rad, 0.4*deg_rad]
+    if domask:
+        locstream["ESMF:Mask"] = np.array([1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], dtype=np.int32)
+
+    return locstream
+
+
+
+
+

LocStream Create Parallel

+
def create_locstream_spherical_16_parallel(coord_sys=esmpy.CoordSys.SPH_DEG, domask=False):
+    """
+    :param coord_sys: the coordinate system of the LocStream
+    :param domask: a boolean to tell whether or not to add a mask
+    :return: LocStream
+    """
+    if esmpy.pet_count() != 4:
+        raise ValueError("processor count must be 4 to use this function")
+
+    deg_rad = pi
+    if coord_sys == esmpy.CoordSys.SPH_DEG:
+        deg_rad = 180.0
+
+    locstream = None
+    if esmpy.local_pet() == 0:
+        locstream = esmpy.LocStream(4, coord_sys=coord_sys)
+        locstream["ESMF:Lon"] = [0.2*deg_rad, 0.5*deg_rad, 0.2*deg_rad, 0.5*deg_rad]
+        locstream["ESMF:Lat"] = [-0.4*deg_rad, -0.4*deg_rad, -0.25*deg_rad, -0.25*deg_rad]
+        if domask:
+            locstream["ESMF:Mask"] = np.array([1, 0, 1, 1], dtype=np.int32)
+    elif esmpy.local_pet() == 1:
+        locstream = esmpy.LocStream(4, coord_sys=coord_sys)
+        locstream["ESMF:Lon"] = [1.5*deg_rad, 1.8*deg_rad, 1.5*deg_rad, 1.8*deg_rad]
+        locstream["ESMF:Lat"] = [-0.4*deg_rad, -0.4*deg_rad, -0.25*deg_rad, -0.25*deg_rad]
+        if domask:
+            locstream["ESMF:Mask"] = np.array([0, 1, 1, 1], dtype=np.int32)
+    elif esmpy.local_pet() == 2:
+        locstream = esmpy.LocStream(4, coord_sys=coord_sys)
+        locstream["ESMF:Lon"] = [0.2*deg_rad, 0.5*deg_rad, 0.2*deg_rad, 0.5*deg_rad]
+        locstream["ESMF:Lat"] = [0.25*deg_rad, 0.25*deg_rad, 0.4*deg_rad, 0.4*deg_rad]
+        if domask:
+            locstream["ESMF:Mask"] = np.array([1, 1, 1, 1], dtype=np.int32)
+    elif esmpy.local_pet() == 3:
+        locstream = esmpy.LocStream(4, coord_sys=coord_sys)
+        locstream["ESMF:Lon"] = [1.5*deg_rad, 1.8*deg_rad, 1.5*deg_rad, 1.8*deg_rad]
+        locstream["ESMF:Lat"] = [0.25*deg_rad, 0.25*deg_rad, 0.4*deg_rad, 0.4*deg_rad]
+        if domask:
+            locstream["ESMF:Mask"] = np.array([1, 1, 1, 1], dtype=np.int32)
+
+    return locstream
+
+
+
+
+

Create a 2D Grid

+
+
def grid_create_from_coordinates(xcoords, ycoords, xcorners=False, ycorners=False, corners=False, domask=False, doarea=False, ctk=esmpy.TypeKind.R8):
+    """
+    Create a 2 dimensional Grid using the bounds of the x and y coordiantes.
+    :param xcoords: The 1st dimension or 'x' coordinates at cell centers, as a Python list or numpy Array
+    :param ycoords: The 2nd dimension or 'y' coordinates at cell centers, as a Python list or numpy Array
+    :param xcorners: The 1st dimension or 'x' coordinates at cell corners, as a Python list or numpy Array
+    :param ycorners: The 2nd dimension or 'y' coordinates at cell corners, as a Python list or numpy Array
+    :param domask: boolean to determine whether to set an arbitrary mask or not
+    :param doarea: boolean to determine whether to set an arbitrary area values or not
+    :param ctk: the coordinate typekind
+    :return: grid
+    """
+    [x, y] = [0, 1]
+
+    # create a grid given the number of grid cells in each dimension, the center stagger location is allocated, the
+    # Cartesian coordinate system and type of the coordinates are specified
+    max_index = np.array([len(xcoords), len(ycoords)])
+    grid = esmpy.Grid(max_index, staggerloc=[esmpy.StaggerLoc.CENTER], coord_sys=esmpy.CoordSys.CART, coord_typekind=ctk)
+
+    # set the grid coordinates using numpy arrays, parallel case is handled using grid bounds
+    gridXCenter = grid.get_coords(x)
+    x_par = xcoords[grid.lower_bounds[esmpy.StaggerLoc.CENTER][x]:grid.upper_bounds[esmpy.StaggerLoc.CENTER][x]]
+    gridXCenter[...] = x_par.reshape((x_par.size, 1))
+
+    gridYCenter = grid.get_coords(y)
+    y_par = ycoords[grid.lower_bounds[esmpy.StaggerLoc.CENTER][y]:grid.upper_bounds[esmpy.StaggerLoc.CENTER][y]]
+    gridYCenter[...] = y_par.reshape((1, y_par.size))
+
+    # create grid corners in a slightly different manner to account for the bounds format common in CF-like files
+    if corners:
+        grid.add_coords([esmpy.StaggerLoc.CORNER])
+        lbx = grid.lower_bounds[esmpy.StaggerLoc.CORNER][x]
+        ubx = grid.upper_bounds[esmpy.StaggerLoc.CORNER][x]
+        lby = grid.lower_bounds[esmpy.StaggerLoc.CORNER][y]
+        uby = grid.upper_bounds[esmpy.StaggerLoc.CORNER][y]
+
+        gridXCorner = grid.get_coords(x, staggerloc=esmpy.StaggerLoc.CORNER)
+        for i0 in range(ubx - lbx - 1):
+            gridXCorner[i0, :] = xcorners[i0+lbx, 0]
+        gridXCorner[i0 + 1, :] = xcorners[i0+lbx, 1]
+
+        gridYCorner = grid.get_coords(y, staggerloc=esmpy.StaggerLoc.CORNER)
+        for i1 in range(uby - lby - 1):
+            gridYCorner[:, i1] = ycorners[i1+lby, 0]
+        gridYCorner[:, i1 + 1] = ycorners[i1+lby, 1]
+
+    # add an arbitrary mask
+    if domask:
+        mask = grid.add_item(esmpy.GridItem.MASK)
+        mask[:] = 1
+        mask[np.where((1.75 <= gridXCenter.any() < 2.25) &
+                      (1.75 <= gridYCenter.any() < 2.25))] = 0
+
+    # add arbitrary areas values
+    if doarea:
+        area = grid.add_item(esmpy.GridItem.AREA)
+        area[:] = 5.0
+
+    return grid
+
+
+
+
+
+

Create a 3D Grid

+
+
def grid_create_from_coordinates_3d(xcoords, ycoords, zcoords, xcorners=False, ycorners=False, zcorners=False, corners=False, domask=False, doarea=False):
+    """
+    Create a 3 dimensional Grid using the xcoordinates, ycoordinates and zcoordinates.
+    :param xcoords: The 1st dimension or 'x' coordinates at cell centers, as a Python list or numpy Array
+    :param ycoords: The 2nd dimension or 'y' coordinates at cell centers, as a Python list or numpy Array
+    :param zcoords: The 3rd dimension or 'z' coordinates at cell centers, as a Python list or numpy Array
+    :param xcorners: The 1st dimension or 'x' coordinates at cell corners, as a Python list or numpy Array
+    :param ycorners: The 2nd dimension or 'y' coordinates at cell corners, as a Python list or numpy Array
+    :param zcorners: The 3rd dimension or 'z' coordinates at cell corners, as a Python list or numpy Array
+    :param corners: boolean to determine whether or not to add corner coordinates to this grid
+    :param domask: boolean to determine whether to set an arbitrary mask or not
+    :param doarea: boolean to determine whether to set an arbitrary area values or not
+    :return: grid
+    """
+    [x, y, z] = [0, 1, 2]
+
+    # create a grid given the number of grid cells in each dimension, the center stagger location is allocated and the
+    # Cartesian coordinate system is specified
+    max_index = np.array([len(xcoords), len(ycoords), len(zcoords)])
+    grid = esmpy.Grid(max_index, staggerloc=[esmpy.StaggerLoc.CENTER_VCENTER], coord_sys=esmpy.CoordSys.CART)
+
+    # set the grid coordinates using numpy arrays, parallel case is handled using grid bounds
+    gridXCenter = grid.get_coords(x)
+    x_par = xcoords[grid.lower_bounds[esmpy.StaggerLoc.CENTER_VCENTER][x]:grid.upper_bounds[esmpy.StaggerLoc.CENTER_VCENTER][x]]
+    gridXCenter[...] = x_par.reshape(x_par.size, 1, 1)
+
+    gridYCenter = grid.get_coords(y)
+    y_par = ycoords[grid.lower_bounds[esmpy.StaggerLoc.CENTER_VCENTER][y]:grid.upper_bounds[esmpy.StaggerLoc.CENTER_VCENTER][y]]
+    gridYCenter[...] = y_par.reshape(1, y_par.size, 1)
+
+    gridZCenter = grid.get_coords(z)
+    z_par = zcoords[grid.lower_bounds[esmpy.StaggerLoc.CENTER_VCENTER][z]:grid.upper_bounds[esmpy.StaggerLoc.CENTER_VCENTER][z]]
+    gridZCenter[...] = z_par.reshape(1, 1, z_par.size)
+
+    # create grid corners in a slightly different manner to account for the bounds format common in CF-like files
+    if corners:
+        grid.add_coords([esmpy.StaggerLoc.CORNER_VFACE])
+        lbx = grid.lower_bounds[esmpy.StaggerLoc.CORNER_VFACE][x]
+        ubx = grid.upper_bounds[esmpy.StaggerLoc.CORNER_VFACE][x]
+        lby = grid.lower_bounds[esmpy.StaggerLoc.CORNER_VFACE][y]
+        uby = grid.upper_bounds[esmpy.StaggerLoc.CORNER_VFACE][y]
+        lbz = grid.lower_bounds[esmpy.StaggerLoc.CORNER_VFACE][z]
+        ubz = grid.upper_bounds[esmpy.StaggerLoc.CORNER_VFACE][z]
+
+        gridXCorner = grid.get_coords(x, staggerloc=esmpy.StaggerLoc.CORNER_VFACE)
+        for i0 in range(ubx - lbx - 1):
+            gridXCorner[i0, :, :] = xcorners[i0+lbx, 0]
+        gridXCorner[i0 + 1, :, :] = xcorners[i0+lbx, 1]
+
+        gridYCorner = grid.get_coords(y, staggerloc=esmpy.StaggerLoc.CORNER_VFACE)
+        for i1 in range(uby - lby - 1):
+            gridYCorner[:, i1, :] = ycorners[i1+lby, 0]
+        gridYCorner[:, i1 + 1, :] = ycorners[i1+lby, 1]
+
+        gridZCorner = grid.get_coords(z, staggerloc=esmpy.StaggerLoc.CORNER_VFACE)
+        for i2 in range(ubz - lbz - 1):
+            gridZCorner[:, :, i2] = zcorners[i2+lbz, 0]
+        gridZCorner[:, :, i2 + 1] = zcorners[i2+lbz, 1]
+
+    # add an arbitrary mask
+    if domask:
+        mask = grid.add_item(esmpy.GridItem.MASK)
+        mask[:] = 1
+        mask[np.where((1.75 < gridXCenter.data < 2.25) &
+                      (1.75 < gridYCenter.data < 2.25) &
+                      (1.75 < gridZCenter.data < 2.25))] = 0
+
+    # add arbitrary areas values
+    if doarea:
+        area = grid.add_item(esmpy.GridItem.AREA)
+        area[:] = 5.0
+
+    return grid
+
+
+
+
+
+

Create a Periodic Grid

+
+
def grid_create_from_coordinates_periodic(longitudes, latitudes, lon_corners=False, lat_corners=False, corners=False, domask=False):
+    """
+    Create a 2 dimensional periodic Grid using the 'longitudes' and 'latitudes'.
+    :param longitudes: longitude coordinate values at cell centers
+    :param latitudes: latitude coordinate values at cell centers
+    :param lon_corners: longitude coordinate values at cell corners
+    :param lat_corners: latitude coordinate values at cell corners
+    :param corners: boolean to determine whether or not to add corner coordinates to this grid
+    :param domask: boolean to determine whether to set an arbitrary mask or not
+    :return: grid
+    """
+    [lon, lat] = [0, 1]
+
+    # create a grid given the number of grid cells in each dimension the center stagger location is allocated
+    max_index = np.array([len(longitudes), len(latitudes)])
+    grid = esmpy.Grid(max_index, num_peri_dims=1, staggerloc=[esmpy.StaggerLoc.CENTER])
+
+    # set the grid coordinates using numpy arrays, parallel case is handled using grid bounds
+    gridXCenter = grid.get_coords(lon)
+    lon_par = longitudes[grid.lower_bounds[esmpy.StaggerLoc.CENTER][lon]:grid.upper_bounds[esmpy.StaggerLoc.CENTER][lon]]
+    gridXCenter[...] = lon_par.reshape((lon_par.size, 1))
+
+    gridYCenter = grid.get_coords(lat)
+    lat_par = latitudes[grid.lower_bounds[esmpy.StaggerLoc.CENTER][lat]:grid.upper_bounds[esmpy.StaggerLoc.CENTER][lat]]
+    gridYCenter[...] = lat_par.reshape((1, lat_par.size))
+
+    # create grid corners in a slightly different manner to account for the bounds format common in CF-like files
+    if corners:
+        grid.add_coords([esmpy.StaggerLoc.CORNER])
+        lbx = grid.lower_bounds[esmpy.StaggerLoc.CORNER][lon]
+        ubx = grid.upper_bounds[esmpy.StaggerLoc.CORNER][lon]
+        lby = grid.lower_bounds[esmpy.StaggerLoc.CORNER][lat]
+        uby = grid.upper_bounds[esmpy.StaggerLoc.CORNER][lat]
+
+        gridXCorner = grid.get_coords(lon, staggerloc=esmpy.StaggerLoc.CORNER)
+        for i0 in range(ubx - lbx - 1):
+            gridXCorner[i0, :] = lon_corners[i0+lbx, 0]
+        gridXCorner[i0 + 1, :] = lon_corners[i0+lbx, 1]
+
+        gridYCorner = grid.get_coords(lat, staggerloc=esmpy.StaggerLoc.CORNER)
+        for i1 in range(uby - lby - 1):
+            gridYCorner[:, i1] = lat_corners[i1+lby, 0]
+        gridYCorner[:, i1 + 1] = lat_corners[i1+lby, 1]
+
+    # add an arbitrary mask
+    if domask:
+        mask = grid.add_item(esmpy.GridItem.MASK)
+        mask[:] = 1
+        mask[np.where((1.75 <= gridXCenter.any() < 2.25) &
+                      (1.75 <= gridYCenter.any() < 2.25))] = 0
+
+    return grid
+
+
+
+
+
+

Create a 5 Element Mesh

+
+
def mesh_create_5():
+    """
+    PRECONDITIONS: None
+    POSTCONDITIONS: A 5 element Mesh has been created.    
+    RETURN VALUES: \n Mesh :: mesh \n
+    
+      4.0   31 ------ 32 ------ 33
+            |         |  22  /   |
+            |    21   |     /    |
+            |         |   /  23  |
+      2.0   21 ------ 22 ------ 23
+            |         |          |
+            |    11   |    12    |
+            |         |          |
+      0.0   11 ------ 12 ------ 13
+    
+           0.0       2.0        4.0
+    
+          Node Ids at corners
+          Element Ids in centers
+    
+    Note: This mesh is not parallel, it can only be used in serial
+    """
+    # Two parametric dimensions, and two spatial dimensions
+    mesh = esmpy.Mesh(parametric_dim=2, spatial_dim=2)
+    
+    num_node = 9
+    num_elem = 5
+    nodeId = np.array([11,12,13,21,22,23,31,32,33])
+    nodeCoord = np.array([0.0,0.0,  # node 11
+                          2.0,0.0,  # node 12
+                          4.0,0.0,  # node 13
+                          0.0,2.0,  # node 21
+                          2.0,2.0,  # node 22
+                          4.0,2.0,  # node 23
+                          0.0,4.0,  # node 31
+                          2.0,4.0,  # node 32
+                          4.0,4.0]) # node 33
+    nodeOwner = np.zeros(num_node)
+
+    elemId = np.array([11,12,21,22,23])
+    elemType=np.array([esmpy.MeshElemType.QUAD,
+                       esmpy.MeshElemType.QUAD,
+                       esmpy.MeshElemType.QUAD,
+                       esmpy.MeshElemType.TRI,
+                       esmpy.MeshElemType.TRI])
+    elemConn=np.array([0,1,4,3, # element 11
+                       1,2,5,4, # element 12
+                       3,4,7,6, # element 21
+                       4,8,7,   # element 22
+                       4,5,8])  # element 23
+    elemCoord = np.array([1.0, 1.0,
+                          3.0, 1.0,
+                          1.0, 3.0,
+                          2.5, 3.5,
+                          3.5, 2.5])
+
+    mesh.add_nodes(num_node,nodeId,nodeCoord,nodeOwner)
+
+    mesh.add_elements(num_elem,elemId,elemType,elemConn, element_coords=elemCoord)
+
+    return mesh, nodeCoord, nodeOwner, elemType, elemConn, elemCoord
+
+
+
+
+
+

Create a Field

+
+
    def create_field(gml, name):
+        '''
+        PRECONDITIONS: An Grid, Mesh or LocStream has been created, and 'name' is a string that
+                       will be used to initialize the name of a new Field.\n
+        POSTCONDITIONS: A Field has been created.\n
+        RETURN VALUES: \n Field :: field \n
+        '''
+        field = Field(gml, name=name)
+
+        return field
+
+
+
+
+
+

Initialize an Analytic Field

+
+
def initialize_field_grid_periodic(field):
+    """
+    PRECONDITIONS: A Field has been created as 'field' with a 'grid'
+                   where coordinates have been set on both 
+                   the center and corner stagger locations. \n
+    POSTCONDITIONS: The 'field' has been initialized to an analytic 
+                    field.\n
+    RETURN VALUES: \n Field :: field \n
+    """
+    DEG2RAD = 3.141592653589793/180.0
+
+    # get the coordinate pointers and set the coordinates
+    [x,y] = [0, 1]
+    gridXCoord = field.grid.get_coords(x, esmpy.StaggerLoc.CENTER)
+    gridYCoord = field.grid.get_coords(y, esmpy.StaggerLoc.CENTER)
+
+    field.data[:] = 2.0 + np.cos(DEG2RAD*gridXCoord)**2 * \
+                          np.cos(2.0*DEG2RAD*(90.0 - gridYCoord))
+
+    return field
+
+
+
+
+
+

Run ESMPy Regridding

+
+
    def run_regridding(srcfield, dstfield, srcfracfield, dstfracfield):
+        # This is for documentation. Do not modify.
+        '''
+        PRECONDITIONS: Two Fields have been created and a regridding
+                       operation is desired from 'srcfield' to 'dstfield'.
+                       The 'srcfracfield' and 'dstfractfield' are Fields
+                       created to hold the fractions of the source and
+                       destination fields which contribute to conservative
+                       regridding.\n
+        POSTCONDITIONS: A regridding operation has set the data on
+                        'dstfield', 'srcfracfield', and 'dstfracfield'.\n
+        RETURN VALUES: \n Field :: dstfield \n
+                          Field :: srcfracfield \n
+                          Field :: dstfracfield \n
+        '''
+        # call the regridding functions
+        regridSrc2Dst = esmpy.Regrid(srcfield, dstfield,
+                                    regrid_method=esmpy.RegridMethod.CONSERVE,
+                                    unmapped_action=esmpy.UnmappedAction.ERROR,
+                                    src_frac_field=srcfracfield,
+                                    dst_frac_field=dstfracfield)
+        dstfield = regridSrc2Dst(srcfield, dstfield)
+
+        return dstfield, srcfracfield, dstfracfield
+
+
+
+
+
+

Compute Field Mass

+
+
def compute_mass_grid(valuefield, dofrac=False, fracfield=None,
+                      uninitval=422397696.):
+    """
+    PRECONDITIONS: 'fracfield' contains the fractions of each cell
+                   which contributed to a regridding operation involving
+                   'valuefield.  'dofrac' is a boolean value that gives 
+                   the option to not use the 'fracfield'.\n
+    POSTCONDITIONS: The mass of the data field is computed.\n
+    RETURN VALUES: float :: mass \n
+    """
+    mass = 0.0
+    areafield = esmpy.Field(valuefield.grid, name='areafield')
+    areafield.get_area()
+
+    ind = np.where(valuefield.data != uninitval)
+
+    if dofrac:
+        mass = np.sum(areafield.data[ind] * valuefield.data[ind] * fracfield.data[ind])
+    else:
+        mass = np.sum(areafield.data[ind] * valuefield.data[ind])
+
+    return mass
+
+
+
+
+
+
+

Regridding

+

The following stand alone scripts demonstrate how to use regridding between +Fields built on +Grids, Meshes +and LocStreams. These scripts +can be run in serial or parallel with no modification.

+
+

Grid, Mesh and Field Created from File

+
+
# This example demonstrates how to create ESMPy Grid, Mesh and Field objects 
+# from file and use them for regridding.
+
+
+import os
+import esmpy
+
+from esmpy.util.cache_data import DATA_DIR
+from esmpy.util.exceptions import DataMissing
+
+# The data files can be retrieved from the ESMF data repository by uncommenting the
+# following block of code:
+#
+# from esmpy.util.cache_data import cache_data_file
+# cache_data_file(os.path.join(DATA_DIR, "so_Omon_GISS-E2.nc"))
+# cache_data_file(os.path.join(DATA_DIR, "mpas_uniform_10242_dual_counterclockwise.nc"))
+
+# This call enables debug logging
+# esmpy.Manager(debug=True)
+
+datafile = os.path.join(DATA_DIR, "so_Omon_GISS-E2.nc")
+if not os.path.exists(datafile):
+    raise DataMissing("Data not available, try 'make download'.")
+meshfile = os.path.join(DATA_DIR, "mpas_uniform_10242_dual_counterclockwise.nc")
+if not os.path.exists(meshfile):
+    raise DataMissing("Data not available, try 'make download'.")
+
+
+# Create a  global grid from a GRIDSPEC formatted file
+grid = esmpy.Grid(filename=os.path.join(DATA_DIR, datafile),
+                 filetype=esmpy.FileFormat.GRIDSPEC)
+
+# Create a field on the centers of the grid, with extra dimensions
+srcfield = esmpy.Field(grid, staggerloc=esmpy.StaggerLoc.CENTER, ndbounds=[33, 2])
+
+# Read the field data from file
+srcfield.read(filename=os.path.join(DATA_DIR, datafile),
+           variable="so", timeslice=2)
+
+# Create an ESMF formatted unstructured mesh with clockwise cells removed
+mesh = esmpy.Mesh(filename=os.path.join(DATA_DIR, meshfile),
+                 filetype=esmpy.FileFormat.ESMFMESH)
+
+# Create a field on the nodes of the mesh
+dstfield = esmpy.Field(mesh, meshloc=esmpy.MeshLoc.NODE, ndbounds=[33, 2])
+
+dstfield.data[:] = 1e20
+
+# compute the weight matrix for regridding
+regrid = esmpy.Regrid(srcfield, dstfield,
+                     regrid_method=esmpy.RegridMethod.BILINEAR,
+                     unmapped_action=esmpy.UnmappedAction.IGNORE)
+
+# calculate the regridding from source to destination field
+dstfield = regrid(srcfield, dstfield)
+
+if esmpy.local_pet() == 0:
+    print ("Fields created from file regridded successfully :)")
+
+
+
+
+
+

Read and Write a Weight File

+
+
# This example demonstrates how to regrid between a Grid and a Mesh.
+
+
+import esmpy
+import numpy
+
+import os
+
+import esmpy.util.helpers as helpers
+import esmpy.api.constants as constants
+
+
+# This call enables debug logging
+mg = esmpy.Manager(debug=True)
+
+# ESMPy uses Fortran style dimension ordering (as of November 2017)
+[lat,lon] = [1,0]
+
+# Create the source grid from memory with periodic dimension specified.
+lons = numpy.arange(5, 350.1, 10)
+lats  = numpy.arange(-85, 85.1, 10)
+srcgrid = esmpy.Grid(numpy.array([lons.size, lats.size]),
+                    coord_sys=esmpy.CoordSys.SPH_DEG,
+                    staggerloc=esmpy.StaggerLoc.CENTER,
+                    num_peri_dims=1, periodic_dim=0, pole_dim=1)
+
+# Get and set the source grid coordinates.
+srcGridCoordLon = srcgrid.get_coords(lon)
+srcGridCoordLat = srcgrid.get_coords(lat)
+
+slons_par = lons[srcgrid.lower_bounds[esmpy.StaggerLoc.CENTER][0]:srcgrid.upper_bounds[esmpy.StaggerLoc.CENTER][0]]
+slats_par = lats[srcgrid.lower_bounds[esmpy.StaggerLoc.CENTER][1]:srcgrid.upper_bounds[esmpy.StaggerLoc.CENTER][1]]
+
+# make sure to use indexing='ij' as ESMPy backend uses matrix indexing (not Cartesian)
+lonm, latm = numpy.meshgrid(slons_par, slats_par, indexing='ij')
+
+srcGridCoordLon[:] = lonm
+srcGridCoordLat[:] = latm
+
+# Create the dest grid from memory with periodic dimension specified.
+lons = numpy.arange(2.5, 357.6, 5)
+lats = numpy.arange(-87.5, 87.6, 5)
+dstgrid = esmpy.Grid(numpy.array([lons.size, lats.size]),
+                    coord_sys=esmpy.CoordSys.SPH_DEG,
+                    staggerloc=esmpy.StaggerLoc.CENTER,
+                    num_peri_dims=1, periodic_dim=1, pole_dim=0)
+
+# Get and set the source grid coordinates.
+dstGridCoordLat = dstgrid.get_coords(lat)
+dstGridCoordLon = dstgrid.get_coords(lon)
+
+dlons_par = lons[dstgrid.lower_bounds[esmpy.StaggerLoc.CENTER][0]:dstgrid.upper_bounds[esmpy.StaggerLoc.CENTER][0]]
+dlats_par = lats[dstgrid.lower_bounds[esmpy.StaggerLoc.CENTER][1]:dstgrid.upper_bounds[esmpy.StaggerLoc.CENTER][1]]
+
+# make sure to use indexing='ij' as ESMPy backend uses matrix indexing (not Cartesian)
+lonm, latm = numpy.meshgrid(dlons_par, dlats_par, indexing='ij')
+
+dstGridCoordLon[:] = lonm
+dstGridCoordLat[:] = latm
+
+# Create a field on the centers of the source grid with the mask applied.
+srcfield = esmpy.Field(srcgrid, name="srcfield", staggerloc=esmpy.StaggerLoc.CENTER)
+
+# Create a field on the centers of the source grid with the mask applied.
+dstfield = esmpy.Field(dstgrid, name="dstfield", staggerloc=esmpy.StaggerLoc.CENTER)
+xctfield = esmpy.Field(dstgrid, name="xctfield", staggerloc=esmpy.StaggerLoc.CENTER)
+
+gridLon = srcfield.grid.get_coords(lon, esmpy.StaggerLoc.CENTER)
+gridLat = srcfield.grid.get_coords(lat, esmpy.StaggerLoc.CENTER)
+
+# wave = lambda x,k:  numpy.sin(x*k*numpy.pi/180.0)
+# srcfield.data[...] = numpy.outer(wave(slons_par,3), wave(slats_par,3)) + 2
+
+srcfield.data[:,:] = 2.0 + numpy.cos(numpy.radians(srcGridCoordLat)[...])**2 * \
+                           numpy.cos(2.0*numpy.radians(srcGridCoordLon)[...])
+
+# wave = lambda x,k:  numpy.sin(x*k*numpy.pi/180.0)
+# xctfield.data[...] = numpy.outer(wave(dlons_par,3), wave(dlats_par,3)) + 2
+
+xctfield.data[:,:] = 2.0 + numpy.cos(numpy.radians(dstGridCoordLat)[...])**2 * \
+                           numpy.cos(2.0*numpy.radians(dstGridCoordLon)[...])
+
+dstfield.data[:] = 1e20
+
+# write regridding weights to file
+filename = "esmpy_example_weight_file.nc"
+if esmpy.local_pet() == 0:
+    if os.path.isfile(
+        os.path.join(os.getcwd(), filename)):
+        os.remove(os.path.join(os.getcwd(), filename))
+
+mg.barrier()
+regrid = esmpy.Regrid(srcfield, dstfield, filename=filename,
+                     regrid_method=esmpy.RegridMethod.BILINEAR,
+                     unmapped_action=esmpy.UnmappedAction.IGNORE)
+
+
+# # create a regrid object from file
+regrid = esmpy.RegridFromFile(srcfield, dstfield, filename)
+
+# calculate the regridding from source to destination field
+dstfield = regrid(srcfield, dstfield)
+
+# compute the mean relative error
+num_nodes = numpy.prod(xctfield.data.shape[:])
+relerr = 0
+meanrelerr = 0
+if num_nodes != 0:
+    relerr = numpy.sum(numpy.abs(dstfield.data - xctfield.data) /
+                       numpy.abs(xctfield.data))
+    meanrelerr = relerr / num_nodes
+
+# handle the parallel case
+if esmpy.pet_count() > 1:
+    relerr = helpers.reduce_val(relerr, op=constants.Reduce.SUM)
+    num_nodes = helpers.reduce_val(num_nodes, op=constants.Reduce.SUM)
+
+# output the results from one processor only
+if esmpy.local_pet() == 0:
+    meanrelerr = relerr / num_nodes
+    print ("ESMPy Grid Mesh Regridding Example")
+    print ("  interpolation mean relative error = {0}".format(meanrelerr))
+
+    if os.path.isfile(os.path.join(os.getcwd(), filename)):
+        os.remove(os.path.join(os.getcwd(), filename))
+
+# set to 1 to output results
+# if esmpy.pet_count() == 0:
+#     import matplotlib.pyplot as plt
+#     fig = plt.figure(1, (15, 6))
+#     fig.suptitle('ESMPy Periodic Grids', fontsize=14, fontweight='bold')
+# 
+#     ax = fig.add_subplot(1, 2, 1)
+#     im = ax.imshow(srcfield.data, vmin=1, vmax=3, cmap='gist_ncar', aspect='auto',
+#                    extent=[min(slons_par), max(slons_par), min(slats_par), max(slats_par)])
+#     ax.set_xbound(lower=min(slons_par), upper=max(slons_par))
+#     ax.set_ybound(lower=min(slats_par), upper=max(slats_par))
+#     ax.set_xlabel("Longitude")
+#     ax.set_ylabel("Latitude")
+#     ax.set_title("Source Data")
+# 
+#     ax = fig.add_subplot(1, 2, 2)
+#     im = ax.imshow(dstfield.data, vmin=1, vmax=3, cmap='gist_ncar', aspect='auto',
+#                    extent=[min(dlons_par), max(dlons_par), min(dlats_par), max(dlats_par)])
+#     ax.set_xlabel("Longitude")
+#     ax.set_ylabel("Latitude")
+#     ax.set_title("Regrid Solution")
+# 
+#     fig.subplots_adjust(right=0.8)
+#     cbar_ax = fig.add_axes([0.9, 0.1, 0.01, 0.8])
+#     fig.colorbar(im, cax=cbar_ax)
+# 
+#     plt.show()
+
+
+
+
+
+

Grid to LocStream

+
+
# This example demonstrates how to regrid between a Grid and a LocStream.
+
+import esmpy
+import numpy
+
+import os
+
+import esmpy.util.helpers as helpers
+import esmpy.api.constants as constants
+from esmpy.util.cache_data import DATA_DIR
+from esmpy.util.exceptions import DataMissing
+
+# The data files can be retrieved from the ESMF data repository by uncommenting the
+# following block of code:
+#
+# from esmpy.util.cache_data import cache_data_file
+# cache_data_file(os.path.join(DATA_DIR, "ll1deg_grid.nc"))
+
+# This call enables debug logging
+esmpy.Manager(debug=True)
+
+grid1 = os.path.join(DATA_DIR, "ll1deg_grid.nc")
+if not os.path.exists(grid1):
+    raise DataMissing("Data not available, try 'make download'.")
+
+from esmpy.util.locstream_utilities import create_locstream_spherical_16, create_locstream_spherical_16_parallel
+coord_sys=esmpy.CoordSys.SPH_DEG
+domask=True
+if esmpy.pet_count() == 1:
+    locstream = create_locstream_spherical_16(coord_sys=coord_sys, domask=domask)
+else:
+    locstream = create_locstream_spherical_16_parallel(coord_sys=coord_sys, domask=domask)
+
+grid = esmpy.Grid(filename=grid1, filetype=esmpy.FileFormat.SCRIP)
+
+# create a field
+srcfield = esmpy.Field(grid, name='srcfield')
+
+dstfield = esmpy.Field(locstream, name='dstfield')
+xctfield = esmpy.Field(locstream, name='xctfield')
+
+# initialize the fields
+[x, y] = [0, 1]
+deg2rad = 3.14159/180
+
+gridXCoord = srcfield.grid.get_coords(x)
+gridYCoord = srcfield.grid.get_coords(y)
+srcfield.data[...] = 10.0 + numpy.cos(gridXCoord * deg2rad) ** 2 + numpy.cos(2 * gridYCoord * deg2rad)
+
+gridXCoord = locstream["ESMF:Lon"]
+gridYCoord = locstream["ESMF:Lat"]
+if coord_sys == esmpy.CoordSys.SPH_DEG:
+    xctfield.data[...] = 10.0 + numpy.cos(gridXCoord * deg2rad) ** 2 + numpy.cos(2 * gridYCoord * deg2rad)
+elif coord_sys == esmpy.CoordSys.SPH_RAD:
+    xctfield.data[...] = 10.0 + numpy.cos(gridXCoord) ** 2 + numpy.cos(2 * gridYCoord)
+else:
+    raise ValueError("coordsys value does not work in this example")
+
+dstfield.data[...] = 1e20
+
+# create an object to regrid data from the source to the destination field
+dst_mask_values=None
+if domask:
+    dst_mask_values=numpy.array([0])
+
+regrid = esmpy.Regrid(srcfield, dstfield,
+                     regrid_method=esmpy.RegridMethod.BILINEAR,
+                     unmapped_action=esmpy.UnmappedAction.ERROR,
+                     dst_mask_values=dst_mask_values)
+
+# do the regridding from source to destination field
+dstfield = regrid(srcfield, dstfield, zero_region=esmpy.Region.SELECT)
+
+# compute the mean relative error
+num_nodes = numpy.prod(xctfield.data.shape[:])
+relerr = 0
+meanrelerr = 0
+
+dstfield = numpy.ravel(dstfield.data)
+xctfield = numpy.ravel(xctfield.data)
+
+if num_nodes != 0:
+    ind = numpy.where((dstfield != 1e20) & (xctfield != 0))[0]
+    relerr = numpy.sum(numpy.abs(dstfield[ind] - xctfield[ind]) / numpy.abs(xctfield[ind]))
+    meanrelerr = relerr / num_nodes
+
+# handle the parallel case
+if esmpy.pet_count() > 1:
+    relerr = helpers.reduce_val(relerr, op=constants.Reduce.SUM)
+    num_nodes = helpers.reduce_val(num_nodes, op=constants.Reduce.SUM)
+
+# output the results from one processor only
+if esmpy.local_pet() == 0:
+    meanrelerr = relerr / num_nodes
+    print ("ESMPy Grid LocStream Regridding Example")
+    print ("  interpolation mean relative error = {0}".format(meanrelerr))
+
+    assert (meanrelerr < 5e-6)
+
+
+
+
+
+

Mesh to LocStream

+
+
# This example demonstrates how to regrid between a mesh and a locstream.
+
+import esmpy
+import numpy
+
+import esmpy.util.helpers as helpers
+import esmpy.api.constants as constants
+
+# This call enables debug logging
+# esmpy.Manager(debug=True)
+
+from esmpy.util.mesh_utilities import mesh_create_5, mesh_create_5_parallel
+from esmpy.util.locstream_utilities import create_locstream_16, create_locstream_16_parallel
+if esmpy.pet_count() == 1:
+    mesh, _, _, _, _, _ = mesh_create_5()
+    locstream = create_locstream_16()
+else:
+    mesh, _, _, _, _ = mesh_create_5_parallel()
+    locstream = create_locstream_16_parallel()
+
+# create a field
+srcfield = esmpy.Field(mesh, name='srcfield')#, meshloc=esmpy.MeshLoc.ELEMENT)
+
+# create a field on the locstream
+dstfield = esmpy.Field(locstream, name='dstfield')
+xctfield = esmpy.Field(locstream, name='xctfield')
+
+# initialize the fields
+[x, y] = [0, 1]
+deg2rad = 3.14159/180
+
+gridXCoord = srcfield.grid.get_coords(x)
+gridYCoord = srcfield.grid.get_coords(y)
+srcfield.data[...] = 10.0 + (gridXCoord * deg2rad) ** 2 + (gridYCoord * deg2rad) ** 2
+
+gridXCoord = locstream["ESMF:X"]
+gridYCoord = locstream["ESMF:Y"]
+xctfield.data[...] = 10.0 + (gridXCoord * deg2rad) ** 2 + (gridYCoord * deg2rad) ** 2
+
+dstfield.data[...] = 1e20
+
+# create an object to regrid data from the source to the destination field
+# TODO: this example seems to fail occasionally with UnmappedAction.ERROR, probably due to a tolerance issue - ask Bob
+regrid = esmpy.Regrid(srcfield=srcfield, dstfield=dstfield, regrid_method=esmpy.RegridMethod.BILINEAR,
+                     unmapped_action=esmpy.UnmappedAction.IGNORE)
+
+# do the regridding from source to destination field
+dstfield = regrid(srcfield, dstfield)
+
+# compute the mean relative error
+num_nodes = numpy.prod(xctfield.data.shape[:])
+relerr = 0
+meanrelerr = 0
+if num_nodes != 0:
+    ind = numpy.where((dstfield.data != 1e20) & (xctfield.data != 0))[0]
+    relerr = numpy.sum(numpy.abs(dstfield.data[ind] - xctfield.data[ind]) / numpy.abs(xctfield.data[ind]))
+    meanrelerr = relerr / num_nodes
+
+# handle the parallel case
+if esmpy.pet_count() > 1:
+    relerr = helpers.reduce_val(relerr, op=constants.Reduce.SUM)
+    num_nodes = helpers.reduce_val(num_nodes, op=constants.Reduce.SUM)
+
+# output the results from one processor only
+if esmpy.local_pet() == 0:
+    meanrelerr = relerr / num_nodes
+    print ("ESMPy Grid Mesh Regridding Example")
+    print ("  interpolation mean relative error = {0}".format(meanrelerr))
+
+    assert (meanrelerr < 3e-5)
+
+
+
+
+
+

LocStream to Grid

+
+
# This example demonstrates how to regrid between a LocStream and a Grid.
+
+import esmpy
+import numpy
+
+import os
+
+import esmpy.util.helpers as helpers
+import esmpy.api.constants as constants
+from esmpy.util.cache_data import DATA_DIR
+from esmpy.util.exceptions import DataMissing
+
+# The data files can be retrieved from the ESMF data repository by uncommenting the
+# following block of code:
+#
+# from esmpy.util.cache_data import cache_data_file
+# cache_data_file(os.path.join(DATA_DIR, "ll1deg_grid.nc"))
+
+# This call enables debug logging
+esmpy.Manager(debug=True)
+
+grid1 = os.path.join(DATA_DIR, "ll1deg_grid.nc")
+if not os.path.exists(grid1):
+    raise DataMissing("Data not available, try 'make download'.")
+
+grid = esmpy.Grid(filename=grid1, filetype=esmpy.FileFormat.SCRIP)
+
+from esmpy.util.locstream_utilities import create_locstream_spherical_16, create_locstream_spherical_16_parallel
+coord_sys=esmpy.CoordSys.SPH_DEG
+domask=True
+if esmpy.pet_count() == 1:
+    locstream = create_locstream_spherical_16(coord_sys=coord_sys, domask=domask)
+else:
+    locstream = create_locstream_spherical_16_parallel(coord_sys=coord_sys, domask=domask)
+
+# create a field
+srcfield = esmpy.Field(locstream, name='srcfield')
+
+dstfield = esmpy.Field(grid, name='dstfield')
+xctfield = esmpy.Field(grid, name='xctfield')
+
+# initialize the fields
+[x, y] = [0, 1]
+deg2rad = 3.14159/180
+
+gridXCoord = locstream["ESMF:Lon"]
+gridYCoord = locstream["ESMF:Lat"]
+if coord_sys == esmpy.CoordSys.SPH_DEG:
+    srcfield.data[...] = 10.0 + numpy.cos(gridXCoord * deg2rad) ** 2 + numpy.cos(2 * gridYCoord * deg2rad)
+elif coord_sys == esmpy.CoordSys.SPH_RAD:
+    srcfield.data[...] = 10.0 + numpy.cos(gridXCoord) ** 2 + numpy.cos(2 * gridYCoord)
+else:
+    raise ValueError("coordsys value does not apply in this example")
+
+gridXCoord = xctfield.grid.get_coords(x)
+gridYCoord = xctfield.grid.get_coords(y)
+xctfield.data[...] = 10.0 + numpy.cos(gridXCoord * deg2rad) ** 2 + numpy.cos(2 * gridYCoord * deg2rad)
+
+
+dstfield.data[...] = 1e20
+
+# create an object to regrid data from the source to the destination field
+mask_values=None
+if domask:
+    mask_values=numpy.array([0])
+
+regrid = esmpy.Regrid(srcfield, dstfield,
+                     regrid_method=esmpy.RegridMethod.NEAREST_DTOS,
+                     unmapped_action=esmpy.UnmappedAction.ERROR,
+                     src_mask_values=mask_values)
+
+# do the regridding from source to destination field
+dstfield = regrid(srcfield, dstfield, zero_region=esmpy.Region.SELECT)
+
+# compute the mean relative error
+from operator import mul
+num_nodes = numpy.prod(xctfield.data.shape[:])
+relerr = 0
+meanrelerr = 0
+
+dstfield = numpy.ravel(dstfield.data)
+xctfield = numpy.ravel(xctfield.data)
+
+if num_nodes != 0:
+    ind = numpy.where((dstfield != 1e20) & (xctfield != 0))[0]
+    relerr = numpy.sum(numpy.abs(dstfield[ind] - xctfield[ind]) / numpy.abs(xctfield[ind]))
+    meanrelerr = relerr / num_nodes
+
+# handle the parallel case
+if esmpy.pet_count() > 1:
+    relerr = helpers.reduce_val(relerr, op=constants.Reduce.SUM)
+    num_nodes = helpers.reduce_val(num_nodes, op=constants.Reduce.SUM)
+
+# output the results from one processor only
+if esmpy.local_pet() == 0:
+    meanrelerr = relerr / num_nodes
+    print ("ESMPy LocStream Grid Regridding Example")
+    print ("  interpolation mean relative error = {0}".format(meanrelerr))
+
+    assert (meanrelerr < 4e-7)
+
+
+
+
+
+

Using MPI.Spawn() from a Serial Python Driver

+
+
# This example demonstrates how to call ESMPy regridding as a parallel
+# subprocess spawned using mpi4py from a serial Python driver.
+#
+# NOTE: MPI.COMM_WORLD.Spawn does not seem to work for mpi4py installations
+#       installations built with mpich, however openmpi does work (July 2016).
+#
+
+import numpy
+from mpi4py import MPI
+import sys, os
+
+from esmpy.util.cache_data import DATA_DIR
+from esmpy.util.exceptions import DataMissing
+
+# The data files can be retrieved from the ESMF data repository by uncommenting the
+# following block of code:
+#
+# from esmpy.util.cache_data import cache_data_file
+# cache_data_file(os.path.join(DATA_DIR, "ll1deg_grid.nc"))
+# cache_data_file(os.path.join(DATA_DIR, "mpas_uniform_10242_dual_counterclockwise.nc"))
+
+
+def regrid():
+    try:
+        import esmpy
+    except:
+        raise ImportError("ESMF is not available on this machine")
+
+    grid1 = os.path.join(DATA_DIR, "ll1deg_grid.nc")
+    if not os.path.exists(grid1):
+        raise DataMissing("Data not available, try 'make download'.")
+
+    grid2 = os.path.join(DATA_DIR, "mpas_uniform_10242_dual_counterclockwise.nc")
+    if not os.path.exists(grid2):
+        raise DataMissing("Data not available, try 'make download'.")
+
+    # Create a uniform global latlon grid from a SCRIP formatted file
+    grid = esmpy.Grid(filename=grid1, filetype=esmpy.FileFormat.SCRIP)
+    # NOTE: corners are needed for conservative regridding
+    # grid = esmpy.Grid(filename=grid1, filetype=esmpy.FileFormat.SCRIP,
+    #                  add_corner_stagger=True)
+
+    # create a field on the center stagger locations of the source grid
+    srcfield = esmpy.Field(grid, name='srcfield',
+                          staggerloc=esmpy.StaggerLoc.CENTER)
+
+    # create an ESMF formatted unstructured mesh with clockwise cells removed
+    mesh = esmpy.Mesh(filename=grid2, filetype=esmpy.FileFormat.ESMFMESH)
+
+    # create a field on the nodes of the destination mesh
+    dstfield = esmpy.Field(mesh, name='dstfield', meshloc=esmpy.MeshLoc.NODE)
+    xctfield = esmpy.Field(mesh, name='xctfield', meshloc=esmpy.MeshLoc.NODE)
+    # NOTE: Field must be built on elements of Mesh for conservative regridding
+    # dstfield = esmpy.Field(mesh, name='dstfield', meshloc=esmpy.MeshLoc.ELEMENT)
+    # xctfield = esmpy.Field(mesh, name='xctfield', meshloc=esmpy.MeshLoc.ELEMENT)
+
+    # initialize the fields
+    [lon, lat] = [0, 1]
+    deg2rad = 3.14159 / 180
+
+    gridXCoord = srcfield.grid.get_coords(lon, esmpy.StaggerLoc.CENTER)
+    gridYCoord = srcfield.grid.get_coords(lat, esmpy.StaggerLoc.CENTER)
+    srcfield.data[...] = 10.0 + (gridXCoord * deg2rad) ** 2 + (
+                                                              gridYCoord * deg2rad) ** 2
+
+    gridXCoord = xctfield.grid.get_coords(lon, esmpy.StaggerLoc.CENTER)
+    gridYCoord = xctfield.grid.get_coords(lat, esmpy.StaggerLoc.CENTER)
+    xctfield.data[...] = 10.0 + (gridXCoord * deg2rad) ** 2 + (
+                                                              gridYCoord * deg2rad) ** 2
+
+    dstfield.data[...] = 1e20
+
+    # create an object to regrid data from the source to the destination field
+    regrid = esmpy.Regrid(srcfield, dstfield,
+                         regrid_method=esmpy.RegridMethod.BILINEAR,
+                         unmapped_action=esmpy.UnmappedAction.ERROR)
+
+    # do the regridding from source to destination field
+    dstfield = regrid(srcfield, dstfield)
+
+    return dstfield, xctfield
+
+def compute_error(dstfield, xctfield):
+    # compute the mean relative error
+    from operator import mul
+    num_nodes = reduce(mul, xctfield.shape)
+    relerr = 0
+    meanrelerr = 0
+    if num_nodes != 0:
+        ind = numpy.where((dstfield != 1e20) & (xctfield != 0))[0]
+        relerr = numpy.sum(
+            numpy.abs(dstfield[ind] - xctfield[ind]) / numpy.abs(
+                xctfield[ind]))
+        meanrelerr = relerr / num_nodes
+
+    meanrelerr = relerr / num_nodes
+    print "ESMPy regridding as a spawned MPI process:"
+    print "  interpolation mean relative error = {0}".format(meanrelerr)
+
+
+########################################### MAIN #############################
+
+start_worker = 'worker'
+usage = 'Program should be started without arguments'
+pet_count = 4
+
+# Parent
+if len(sys.argv) == 1:
+
+    # Spawn workers
+    comm = MPI.COMM_WORLD.Spawn(
+        sys.executable,
+        args=[sys.argv[0], start_worker],
+        maxprocs=pet_count)
+
+    # gather output fields from workers
+    dstfield = None
+    dstfield = comm.gather(dstfield, root=MPI.ROOT)
+    dstfield = numpy.concatenate([dstfield[i] for i in range(pet_count)])
+
+    xctfield = None
+    xctfield = comm.gather(xctfield, root=MPI.ROOT)
+    xctfield = numpy.concatenate([xctfield[i] for i in range(pet_count)])
+
+    # plot results
+    compute_error(dstfield, xctfield)
+
+    # Shutdown
+    comm.Disconnect()
+
+# Worker
+elif sys.argv[1] == start_worker:
+
+    # Connect to parent
+    try:
+        comm = MPI.Comm.Get_parent()
+        rank = comm.Get_rank()
+    except:
+        raise ValueError('Could not connect to parent - ' + usage)
+
+    try:
+        # call ESMPy regridding
+        dstfield, xctfield = regrid()
+
+        # send output to parent
+        comm.gather(sendobj=dstfield.data, root=0)
+        comm.gather(sendobj=xctfield.data, root=0)
+    except:
+        comm.Disconnect()
+
+    # Shutdown
+    comm.Disconnect()
+
+# Catch
+else:
+    raise ValueError(usage)
+
+
+
+
+
+
+ + +
+
+
+
+ +
+
+ + + + \ No newline at end of file diff --git a/docs/nightly/fix/reconcile-info/html/field.html b/docs/nightly/fix/reconcile-info/html/field.html new file mode 100644 index 00000000..8ced211d --- /dev/null +++ b/docs/nightly/fix/reconcile-info/html/field.html @@ -0,0 +1,387 @@ + + + + + + + + Field — ESMPy 8.8.0b0 documentation + + + + + + + + + + + + + + +
+
+
+
+ +
+

Field

+
+
+class esmpy.api.field.Field(grid, name=None, typekind=None, staggerloc=None, meshloc=None, ndbounds=None)
+

The Field class is a Python wrapper object for the ESMF Field. +The individual values of all data arrays are referenced to those of the +underlying Fortran ESMF object.

+

A Field represents a physical field, such as temperature. The Field class +contains distributed and discretized field data, a reference to its +associated grid, and metadata. The Field class stores the grid staggering +for that physical field. This is the relationship of how the data array of +a field maps onto a grid (e.g. one item per cell located at the cell center, +one item per cell located at the NW corner, one item per cell vertex, etc.). +This means that different Fields which are on the same underlying Grid but +have different staggerings can share the same Grid object without needing to +replicate it multiple times.

+

Refer to the Field Class of the +ESMF Reference Manual +for more information.

+

The following parameters are used to create a Field +from a Grid, Mesh or +LocStream.

+

REQUIRED:

+
+
:param Grid/Mesh/LocStream grid: A Grid,

Mesh or LocStream +with coordinates allocated on at least one stagger location.

+
+
+

OPTIONAL:

+
+
Parameters:
+
    +
  • name (str) – An optional user friendly name for the +Field.

  • +
  • typekind (TypeKind) – Type of the Field +data. If None, defaults to R8.

  • +
  • staggerloc (StaggerLoc) – The stagger location of the +Field data, only specify this argument when +using a Grid. +If None, defaults to CENTER +in 2D and CENTER_VCENTER in 3D.

  • +
  • meshloc (MeshLoc) – The mesh location of the +Field data, only specify this argument when +using a Mesh +if None, defaults to NODE.

  • +
  • ndbounds (tuple) – The number of entries in an extra +Field dimension. This is represented as a +single value, a list or a tuple containing the number of entries for +each desired extra dimension of the Field. The +time dimension must be last, following Fortran indexing conventions.

  • +
+
+
+
+
+property data
+
+
Return type:
+

TypeKind

+
+
Returns:
+

The data of the Field

+
+
+
+ +
+
+property grid
+
+
Return type:
+

Grid, Mesh, or +LocStream

+
+
Returns:
+

The discretization object upon which the +Field is built.

+
+
+
+ +
+
+property lower_bounds
+
+
Return type:
+

ndarray

+
+
Returns:
+

The lower bounds of the Field.

+
+
+
+ +
+
+property name
+
+
Return type:
+

str

+
+
Returns:
+

the name of the Field.

+
+
+
+ +
+
+property ndbounds
+
+
Return type:
+

list

+
+
Returns:
+

The bounds of the extra dimensions in the +Field.

+
+
+
+ +
+
+property rank
+
+
Return type:
+

int

+
+
Returns:
+

The rank of the Field.

+
+
+
+ +
+
+property staggerloc
+
+
Return type:
+

StaggerLoc or +MeshLoc

+
+
Returns:
+

The location upon which the Field +is built.

+
+
+
+ +
+
+property type
+
+
Return type:
+

TypeKind

+
+
Returns:
+

The type of the data in the Field.

+
+
+
+ +
+
+property upper_bounds
+
+
Return type:
+

ndarray

+
+
Returns:
+

The upper bounds of the Field.

+
+
+
+ +
+
+property xd
+
+
Return type:
+

int

+
+
Returns:
+

The number of extra (ungridded) dimensions of the +Field.

+
+
+
+ +
+
+copy()
+

Copy a Field in an ESMF-safe manner.

+
+
Returns:
+

A Field shallow copy.

+
+
+
+ +
+
+destroy()
+

Release the memory associated with a Field.

+
+ +
+
+get_area()
+

Initialize an existing Field with the areas of +the cells of the underlying Grid or +Mesh.

+
+ +
+
+read(filename, variable, timeslice=None)
+

Read data into an existing Field from a +CF-compliant NetCDF file.

+
+
Note:
+

This interface is not supported when ESMF is built with +ESMF_COMM=mpiuni.

+
+
Note:
+

This interface does not currently support reading ungridded +dimensions.

+
+
+

REQUIRED:

+
+
Parameters:
+
    +
  • filename (str) – The name of the NetCDF file.

  • +
  • variable (str) – The name of the data variable to read from file.

  • +
+
+
+

OPTIONAL:

+
+
Parameters:
+

timeslice (int) – The number of timeslices to read.

+
+
+
+ +
+ +
+ + +
+
+
+
+ +
+
+ + + + \ No newline at end of file diff --git a/docs/nightly/fix/reconcile-info/html/genindex.html b/docs/nightly/fix/reconcile-info/html/genindex.html new file mode 100644 index 00000000..1b099681 --- /dev/null +++ b/docs/nightly/fix/reconcile-info/html/genindex.html @@ -0,0 +1,633 @@ + + + + + + + Index — ESMPy 8.8.0b0 documentation + + + + + + + + + + + + +
+
+
+
+ + +

Index

+ +
+ _ + | A + | B + | C + | D + | E + | F + | G + | H + | I + | L + | M + | N + | P + | Q + | R + | S + | T + | U + | V + | W + | X + +
+

_

+ + +
+ +

A

+ + + +
+ +

B

+ + + +
+ +

C

+ + + +
+ +

D

+ + + +
+ +

E

+ + + +
+ +

F

+ + + +
+ +

G

+ + + +
+ +

H

+ + + +
+ +

I

+ + + +
+ +

L

+ + + +
+ +

M

+ + + +
+ +

N

+ + + +
+ +

P

+ + + +
+ +

Q

+ + +
+ +

R

+ + + +
+ +

S

+ + + +
+ +

T

+ + + +
+ +

U

+ + + +
+ +

V

+ + +
+ +

W

+ + +
+ +

X

+ + +
+ + + +
+
+
+
+ +
+
+ + + + \ No newline at end of file diff --git a/docs/nightly/fix/reconcile-info/html/grid.html b/docs/nightly/fix/reconcile-info/html/grid.html new file mode 100644 index 00000000..51bfa963 --- /dev/null +++ b/docs/nightly/fix/reconcile-info/html/grid.html @@ -0,0 +1,655 @@ + + + + + + + + Grid — ESMPy 8.8.0b0 documentation + + + + + + + + + + + + + + +
+
+
+
+ +
+

Grid

+
+
+class esmpy.api.grid.Grid(max_index=None, num_peri_dims=0, periodic_dim=None, pole_dim=None, coord_sys=None, coord_typekind=None, staggerloc=None, pole_kind=None, filename=None, filetype=None, reg_decomp=None, decompflag=None, is_sphere=None, add_corner_stagger=None, add_user_area=None, add_mask=None, varname=None, coord_names=None, tilesize=None, regDecompPTile=None, name=None)
+

The Grid class is a Python wrapper object for the ESMF Grid. The individual +values of all coordinate and mask arrays are referenced to those of the +underlying Fortran ESMF object.

+

The Grid class is used to describe the geometry and +discretization of logically rectangular physical grids. It also contains +the description of the underlying topology and decomposition of the physical +grid across the available computational resources. The most frequent use of +the Grid class is to describe physical grids in user +code so that sufficient information is available to perform regridding +operations.

+

Refer to the Grid Class of the +ESMF Reference Manual +for more information.

+

A Grid can be created in two different ways, as a +Grid in memory, or from SCRIP formatted or CF compliant GRIDSPEC file. The +arguments for each type of Grid creation are +outlined below.

+

Created in-memory:

+

REQUIRED:

+
+
Parameters:
+

max_index (list) – An integer list of length 2 or 3, with the +number of grid cells in each dimension.

+
+
+

OPTIONAL:

+
+
Parameters:
+
    +
  • num_peri_dims (int) – The number of periodic dimensions, either 0 +or 1. If None, defaults to 0.

  • +
  • periodic_dim (int) – The periodic dimension: 0, 1 or 2. +If None, defaults to 0.

  • +
  • pole_dim (int) – The pole dimension 0 or 1. +If None, defaults to 1.

  • +
  • coord_sys (CoordSys) – Coordinate system for the +Grid. +If None, defaults to SPH_DEG.

  • +
  • coord_typekind (TypeKind) – Type of the Grid +coordinates. +If None, defaults to R8.

  • +
+
+
+

Created either from file or in-memory:

+
+
Parameters:
+
    +
  • staggerloc (StaggerLoc) – The stagger location of the coordinate values. +If None, defaults to CENTER +in 2D and CENTER_VCENTER in 3D.

  • +
  • pole_kind (PoleKind) – Two item list which specifies the type of +connection which occurs at the pole. The first value specifies the +connection that occurs at the minimum end of the pole dimension. +The second value specifies the connection that occurs at the maximum +end of the pole dimension. +If None, defaults to MONOPOLE.

  • +
+
+
+

Created from file:

+

REQUIRED:

+
+
Parameters:
+
+
+
+

OPTIONAL:

+
+
Parameters:
+
    +
  • is_sphere (bool) – Set to True for a spherical grid, or False +for regional. Defaults to True.

  • +
  • add_corner_stagger (bool) – Set to True to use the information in +the grid file to add the corner stagger to the grid. The coordinates for +the corner stagger are required for conservative regridding. If +not specified, defaults to False.

  • +
  • add_user_area (bool) – Set to True to read in the cell area from the +grid file; otherwise, ESMF will calculate it. Defaults to False.

  • +
  • add_mask (bool) – Set to True to generate the mask using the +missing_value attribute defined in varname. This argument is +only supported with filetype +GRIDSPEC. +Defaults to False.

  • +
  • varname (str) – If add_mask is True, provide a variable name stored +in the grid file and the mask will be generated using the missing value +of the data value of this variable. The first two dimensions of the +variable has to be the longitude and the latitude dimension and the +mask is derived from the first 2D values of this variable even if this +data is a 3D, or 4D array. This argument is only supported with +filetype GRIDSPEC. +Defaults to None.

  • +
  • coord_names (list) – A two-element array containing the longitude and +latitude variable names in a GRIDSPEC file if there are multiple +coordinates defined in the file. This argument is only supported with +filetype GRIDSPEC. +Defaults to None.

  • +
+
+
+

Cubed sphere:

+

REQUIRED:

+
+
Parameters:
+

tilesize (int) – The number of elements on each side of the tile of the +cubed sphere grid.

+
+
+

OPTIONAL:

+
+
Parameters:
+
    +
  • regDecompPTile (list) – List of DE counts for each dimension. The second index steps through +the tiles. The total deCount is determined as the sum over +the products of regDecompPTile elements for each tile. +By default every tile is decomposed in the same way. If the total +PET count is less than 6, one tile will be assigned to one DE and the DEs +will be assigned to PETs sequentially, therefore, some PETs may have +more than one DE. If the total PET count is greater than 6, the total +number of DEs will be a multiple of 6 and less than or equal to the total +PET count. For instance, if the total PET count is 16, the total DE count +will be 12 with each tile decomposed into 1x2 blocks. The 12 DEs are mapped +to the first 12 PETs and the remaining 4 PETs have no DEs locally.

  • +
  • name (str) – The name of the Grid.

  • +
+
+
+
+
+property area
+
+
Return type:
+

A list of numpy arrays with an entry for every stagger location +of the Grid.

+
+
Returns:
+

The Grid cell areas represented as +numpy arrays of floats of size given by +upper_bounds - lower_bounds.

+
+
+
+ +
+
+property areatype
+
+
Return type:
+

TypeKind

+
+
Returns:
+

The ESMF typekind of the Grid cell +areas.

+
+
+
+ +
+
+property coords
+
+
Return type:
+

2D list of numpy arrays of size given by +upper_bounds - lower_bounds, where the first index represents +the stagger locations of the Grid and the +second index represent the coordinate dimensions of the +Grid.

+
+
Returns:
+

The coordinates of the Grid.

+
+
+
+ +
+
+property coord_sys
+
+
Return type:
+

CoordSys

+
+
Returns:
+

The coordinate system of the Grid.

+
+
+
+ +
+
+property has_corners
+
+
Return type:
+

bool

+
+
Returns:
+

A boolean value to tell if the Grid +has corners allocated.

+
+
+
+ +
+
+property lower_bounds
+
+
Return type:
+

A list of numpy arrays with an entry for every stagger location +of the Grid.

+
+
Returns:
+

The lower bounds of the Grid +represented as numpy arrays of ints of size given by +upper_bounds - lower_bounds.

+
+
+
+ +
+
+property mask
+
+
Return type:
+

A list of numpy arrays with an entry for every stagger location +of the Grid.

+
+
Returns:
+

The mask of the Grid represented as +numpy arrays of ints of size given by ` +upper_bounds - lower_bounds`.

+
+
+
+ +
+
+property max_index
+
+
Return type:
+

A numpy array with as many values as the +Grid rank.

+
+
Returns:
+

The number of Grid cells in each +dimension of the grid.

+
+
+
+ +
+
+property num_peri_dims
+
+
Return type:
+

int

+
+
Returns:
+

The total number of periodic dimensions in the +Grid.

+
+
+
+ +
+
+property periodic_dim
+
+
Return type:
+

int

+
+
Returns:
+

The periodic dimension of the Grid +(e.g. 0 for x or longitude, 1 for y or +latitude, etc.).

+
+
+
+ +
+
+property pole_dim
+
+
Return type:
+

int

+
+
Returns:
+

The pole dimension of the Grid +(e.g. 0 for x or longitude, 1 for y or +latitude, etc.).

+
+
+
+ +
+
+property rank
+
+
Return type:
+

int

+
+
Returns:
+

The rank of the Grid.

+
+
+
+ +
+
+property size
+
+
Return type:
+

A list of numpy arrays with an entry for every stagger location +of the Grid.

+
+
Returns:
+

The size of the Grid represented as +numpy arrays of ints of size given by +upper_bounds - lower_bounds.

+
+
+
+ +
+
+property staggerloc
+
+
Return type:
+

list of bools

+
+
Returns:
+

The stagger locations that have been allocated for the +Grid.

+
+
+
+ +
+
+property type
+
+
Return type:
+

TypeKind

+
+
Returns:
+

The ESMF typekind of the Grid +coordinates.

+
+
+
+ +
+
+property upper_bounds
+
+
Return type:
+

A list of numpy arrays with an entry for every stagger location +of the Grid.

+
+
Returns:
+

The upper bounds of the Grid +represented as numpy arrays of ints of size given by +upper_bounds - lower_bounds.

+
+
+
+ +
+
+add_coords(staggerloc=None, coord_dim=None, from_file=False)
+

Add coordinates to the Grid at the specified +stagger location.

+
+
Parameters:
+
    +
  • staggerloc (StaggerLoc) – The stagger location of the coordinate +values. If None, defaults to +CENTER +in 2D and CENTER_VCENTER in +3D.

  • +
  • coord_dim (int) – The dimension number of the coordinates to return +e.g. [x, y, z] = (0, 1, 2), or [lon, lat] = (0, 1) +(coordinates will not be returned if coord_dim is not specified and +staggerlocs is a list with more than one element).

  • +
  • from_file (bool) – Boolean for internal use to determine whether the +Grid has already been created from file.

  • +
+
+
Returns:
+

A numpy array of coordinate values if staggerloc and +coord_dim are specified, otherwise return None.

+
+
+
+ +
+
+add_item(item, staggerloc=None, from_file=False)
+

Allocate space for a Grid item (mask or areas) +at a specified stagger location.

+

REQUIRED:

+
+
Parameters:
+

item (GridItem) – The GridItem to +allocate.

+
+
+

OPTIONAL:

+
+
Parameters:
+
    +
  • staggerloc (StaggerLoc) – The stagger location of the item +values. If None, defaults to +CENTER +in 2D and CENTER_VCENTER in +3D.

  • +
  • from_file (bool) – Boolean for internal use to determine whether the +Grid has already been created from file.

  • +
+
+
Returns:
+

A numpy array of the mask or area values if a single +staggerloc is given, otherwise return None.

+
+
+
+ +
+
+copy()
+

Copy a Grid in an ESMF-safe manner.

+
+
Returns:
+

A Grid shallow copy.

+
+
+
+ +
+
+destroy()
+

Release the memory associated with a Grid.

+
+ +
+
+get_coords(coord_dim, staggerloc=None)
+

Return a numpy array of coordinates at a specified stagger +location. The returned array is NOT a copy, it is +directly aliased to the underlying memory allocated by esmpy.

+

REQUIRED:

+
+
Parameters:
+

coord_dim (int) – The dimension number of the coordinates to return +e.g. [x, y, z] = (0, 1, 2), or [lon, lat] = (0, 1) +(coordinates will not be returned if coord_dim is not specified +and staggerlocs is a list with more than one element).

+
+
+

OPTIONAL:

+
+
Parameters:
+

staggerloc (StaggerLoc) – The stagger location of the coordinate +values. If None, defaults to +CENTER +in 2D and CENTER_VCENTER in +3D.

+
+
Returns:
+

A numpy array of coordinate values at the specified staggerloc.

+
+
+
+ +
+
+get_item(item, staggerloc=None)
+

Return a numpy array of item values at a specified stagger +location. The returned array is NOT a copy, it is +directly aliased to the underlying memory allocated by esmpy.

+

REQUIRED:

+
+
Parameters:
+

item (GridItem) – The GridItem to +return.

+
+
+

OPTIONAL:

+
+
Parameters:
+

staggerloc (StaggerLoc) – The stagger location of the item +values. If None, defaults to +CENTER in 2D and +CENTER_VCENTER in 3D.

+
+
Returns:
+

A numpy array of mask or area values at the specified staggerloc.

+
+
+
+ +
+ +
+ + +
+
+
+
+ +
+
+ + + + \ No newline at end of file diff --git a/docs/nightly/fix/reconcile-info/html/index.html b/docs/nightly/fix/reconcile-info/html/index.html new file mode 100644 index 00000000..e0113306 --- /dev/null +++ b/docs/nightly/fix/reconcile-info/html/index.html @@ -0,0 +1,221 @@ + + + + + + + + Table of Contents — ESMPy 8.8.0b0 documentation + + + + + + + + + + + + + +
+ + +
+
+ + + + \ No newline at end of file diff --git a/docs/nightly/fix/reconcile-info/html/install.html b/docs/nightly/fix/reconcile-info/html/install.html new file mode 100644 index 00000000..be04cb7c --- /dev/null +++ b/docs/nightly/fix/reconcile-info/html/install.html @@ -0,0 +1,268 @@ + + + + + + + + Installation — ESMPy 8.8.0b0 documentation + + + + + + + + + + + + + + +
+
+
+
+ +
+

Installation

+
+

Requirements

+

The following packages are required to work with ESMPy:

+ +

The following packages are optional:

+
    +
  • +
    ESMF installation with NetCDF - required to create Grids, Meshes and Fields from file, and to write regridding weights to file
      +
    • NetCDF must be built as a shared library for ESMPy installation to succeed

    • +
    +
    +
    +
  • +
  • ESMF installation with PIO (the Parallel IO library) - required to create Meshes and Fields from file, and to write regridding weights to file

  • +
  • mpi4py- python bindings to MPI, needed to run some of the parallel regridding examples

  • +
  • pytest - for testing

  • +
+
+
+

Getting the code

+

The ESMPy source code can be downloaded from the +ESMF git repository.

+

The ESMF User’s Guide +contains information on building and installing esmpy.

+

The ESMF Reference Manual +contains information on the architecture of ESMF, example code, and details of the API (Application Programming +Interface).

+
+

Anaconda Packages

+

ESMPy conda packages are available through the conda-forge channel:

+
conda create -n esmpy -c conda-forge esmpy
+
+
+

Specific versions of the conda package can be installed like this:

+
conda create -n esmpy -c conda-forge esmpy=8.1.0
+
+
+

Development versions can be found in the esmpy_dev channel:

+
conda create -n esmpy -c conda-forge -c esmpy_dev esmpy
+
+
+
+
+
+

Installing ESMPy from Source

+

When installing from source, ESMPy uses pip +to build and install the package. An installation of ESMPy in the default location for Python packages can be done +with the following command issued from the top level ESMPy directory (src/addon/esmpy):

+
python3 -m pip install .
+
+
+

Please contact esmf_support@ucar.edu with any questions.

+
+

Note

+

With some python versions, there is a problem with the automatic installation of the required package setuptools-git-versioning. If the output from the pip install command ends with Successfully installed esmpy-0.0.0, this indicates that the setuptools-git-versioning package was not invoked and the build thinks you are using ESMF version 0.0.0. This will cause problems when you try to use ESMPy. To solve this problem, simply rerun the above installation command (python3 -m pip install .). You should then see a reasonable version number at the end, such as, Successfully installed esmpy-8.4.0.

+
+
+
+

Importing ESMPy

+

To use ESMPy in an external program, import it with:

+
import esmpy
+
+
+

The environment variable ESMFMKFILE should be set when using ESMPy. If it is not found, the package will +try to guess a few very common locations, but we recommend correctly setting the variable nonetheless.

+
+

Note

+

The Python module name for ESMPy was changed in v8.4.0 from “ESMF” to “esmpy”. If you are using a version older than v8.4.0, the import command is import ESMF. See the ESMF Release Notes for more details and links to previous versions of the ESMPy documentation.

+
+
+
+

Validation

+

The ESMPy testing is done with the pytest package, both in serial and +parallel. Basic unit tests can be run with the following command, from +the top level ESMPy directory (src/addon/esmpy):

+
python3 -m pytest
+
+
+

There are a few other pytest targets available for a wider range of testing if +greater test coverage is desired:

+
make test_unit
+
+make test_examples
+
+make test_unit_parallel
+
+make test_examples_parallel
+
+make test_regrid_from_file
+
+
+
+

Note

+

The regrid_from_file and example tests can take up a lot of memory +and bandwidth. The download_regrid_from_file and download_examples +commands will simply download the test files without actually running them +(allowing the stress on the machine to be applied to bandwidth first, and +then memory).

+
+
+

Note

+

By default, test data will be downloaded to a data subdirectory of the ESMPy installation directory. This location can be changed by setting one of the following environment variables:

+
    +
  • If ESMPY_DATA_DIR is set, this should point to a directory that has already been populated with the necessary data; the pre-existing data will be read from this directory and no automatic downloads will be attempted.

  • +
  • Otherwise, if ESMPY_DATA_NEW_DIR is set, data will be downloaded to the path set by this variable instead of using the data subdirectory of the ESMPy installation directory.

  • +
+
+
+
+

Limitations

+

ESMPy doesn’t include many aspects of ESMF, including components, field bundles, +time management, etc. The limitations listed here are relative +to ESMF offline and integrated regridding capabilities.

+
    +
  • ESMPy cannot use an ESMF installation that is built with external LAPACK +support.

  • +
  • Coordinates cannot be retrieved from the elements of a +Mesh. This can affect the ability to set +Field values on a source Mesh +created from file when using conservative regridding.

  • +
  • Multi-tile Grid support is limited to cubed-sphere +grids created on 6 processors. A cubed-sphere grid can be created on any +number of processors, but only when it is created on 6 processors will the +coordinates be retrievable for the entire object. A +Field created from a cubed-sphere +Grid cannot be written to file in parallel.

  • +
  • There is no FieldBundle class, only single Fields.

  • +
+

Testing related:

+
    +
  • Nightly regression testing is limited to a small subset of the ESMF test platforms, +including Darwin and Linux running gfortran with openMPI.

  • +
+
+
+ + +
+
+
+
+ +
+
+ + + + \ No newline at end of file diff --git a/docs/nightly/fix/reconcile-info/html/intro.html b/docs/nightly/fix/reconcile-info/html/intro.html new file mode 100644 index 00000000..3f923747 --- /dev/null +++ b/docs/nightly/fix/reconcile-info/html/intro.html @@ -0,0 +1,193 @@ + + + + + + + + Overview — ESMPy 8.8.0b0 documentation + + + + + + + + + + + + + + +
+
+
+
+ +
+

Overview

+

ESMPy is a Python interface to the Earth System Modeling Framework (ESMF) +regridding utility. ESMF is software for +building and coupling weather, climate, and related models. ESMF has a robust, +parallel and scalable remapping package, used to generate remapping weights. +It can handle a wide variety of grids and options: logically rectangular grids, +unstructured meshes and sets of unconnected points; regional or global grids; +2D or 3D; and pole and masking options. ESMF also has capabilities to read grid +information from NetCDF files in a variety of formats, including the +Climate and Forecast (CF) V1.6 (a.k.a GridSpec), +UGRID, +ESMF Unstructured and SCRIP conventions. Information on these last two conventions +can be found in the +ESMF Reference Manual.

+

ESMPy provides a Grid to represent single-tile logically +rectangular coordinate data, a Mesh for unstructured +coordinates, and a LocStream for collections of +unconnected points like observational data streams. +ESMPy supports bilinear, nearest neighbor, higher order patch recovery, +first-order conservative and second-order conservative regridding. There is +also an option to ignore unmapped destination points, mask out points on either +the source or destination, choose straight line or great circle paths when using +spherical coordinates and extrapolate data to points outside of the destination +domain. Regridding on the sphere takes place in 3D Cartesian space, so the pole +problem is not an issue as it commonly is with many Earth system grid remapping +softwares. Grid and Mesh +objects can be created in 2D or 3D space, and 3D conservative regridding is +fully supported.

+

Regridding, also called remapping or interpolation, is the process of changing +the grid underneath field data values while preserving the qualities of the +original data. Different kinds of transformations are appropriate for +different problems. Regridding may be needed when communicating data between +Earth system modeling components such as land and atmosphere, or between +different data sets to support analysis or visualization.

+

Regridding can be broken into two stages. The first stage is generation of an +interpolation weight matrix that describes how points in the source grid +contribute to points in the destination grid. The second stage is the +multiplication of values on the source grid by the interpolation weight matrix +to produce the appropriate values on the destination grid. ESMPy provides +access to both stages through two separate interfaces.

+

There are many different interpolation methods, suitable for different problems. +In ESMPy, the basic bilinear option is a two dimensional variant of linear +interpolation. The higher order patch recovery is a second degree polynomial +regridding method, which uses a least squares algorithm to calculate the +polynomial. This method gives better derivatives in the resulting destination +field than the bilinear. There are two nearest-neighbor methods which map the +points from one grid to the nearest corresponding point on the other grid, from +either source to destination or vice versa. These are useful for extrapolation +or categorical fields.

+

The first-order conservative regridding is a method designed to preserve the +integral of the field across the interpolation from source to destination. It +uses the proportion of the area of the overlapping source and destination cells +to determine appropriate weights. The second-order conservative method also +preserves the integral, but uses the source gradient to give a smoother result +than the first-order conservative. All of these methods can be broken down to a +simple sparse matrix multiplication operation between interpolation weights and +data values.

+
+ + + +
+
+
+
+ +
+
+ + + + \ No newline at end of file diff --git a/docs/nightly/fix/reconcile-info/html/locstream.html b/docs/nightly/fix/reconcile-info/html/locstream.html new file mode 100644 index 00000000..1ba0b168 --- /dev/null +++ b/docs/nightly/fix/reconcile-info/html/locstream.html @@ -0,0 +1,299 @@ + + + + + + + + LocStream — ESMPy 8.8.0b0 documentation + + + + + + + + + + + + + + +
+
+
+
+ +
+

LocStream

+
+
+class esmpy.api.locstream.LocStream(location_count, coord_sys=None, name=None, esmf=True)
+

The LocStream class is a Python wrapper object for the ESMF LocStream. +LocStream is a derived type of a Python dictionary.

+

The individual values of all key arrays are referenced to those of the +underlying Fortran ESMF object.

+

A LocStream is used to represent the locations of a +set of data points. The values of the data points are stored within a +Field created using the LocStream.

+

In the data assimilation world, location streams can be thought of as a set +of observations. Their locations are generally described using Cartesian +(x, y, z), or (lat, lon, height) coordinates. There is no assumption +of any regularity in the positions of the points. To make the concept more +general, the locations for each data point are represented using a construct +called keys. Keys can include other descriptors besides location, including +a second set of coordinates.

+

Refer to the LocStrea Class of the +ESMF Reference Manual +for more information.

+

LocStream follows standard dictionary syntax. For example:

+
>>> locstream["ESMF:X"] = [1, 2, 3]
+>>> x = locstream["ESMF:X"]
+>>> locstream["ESMF:Y"] = [1, 2, 3]
+>>> y = locstream["ESMF:Y"]
+>>> locstream["ESMF:Mask"] = [0, 1, 0]
+>>> mask = locstream["ESMF:Mask"]
+
+
+
+

Note

+

Setting keys of lists of mixed types can result in errors due to +type mismatches from the ESMF library.

+
+
+

Note

+

Mask must be of type I4, +and coordinates must by of type R8.

+
+

For ESMF to be able to recognize coordinates specified in a LocStream key +they need to be named with the appropriate identifiers. The particular +identifiers depend on the coordinate system (i.e. coord_sys argument) +used to create the LocStream.

+

The valid values are:

+ + + + + + + + + + + + + + + + + + + + + + + + + +

Coordinate System

dimension 1

dimension 2

dimension 3

SPH_DEG

ESMF:Lon

ESMF:Lat

ESMF:Radius

SPH_RAD

ESMF:Lon

ESMF:Lat

ESMF:Radius

CART

ESMF:X

ESMF:Y

ESMF:Z

+
+
Parameters:
+
    +
  • location_count (int) – The number of points in this stream.

  • +
  • coord_sys (CoordSys) – Coordinate system for the location stream. +If None, defaults to SPH_DEG.

  • +
  • name (str) – Optional name for the location stream.

  • +
  • esmf (bool) – Internal parameter controlling shallow copying by esmpy.

  • +
+
+
+
+
+property lower_bounds
+
+
Return type:
+

int

+
+
Returns:
+

The lower bounds of the LocStream.

+
+
+
+ +
+
+property name
+
+
Return type:
+

str

+
+
Returns:
+

The name of the LocStream.

+
+
+
+ +
+
+property rank
+
+
Return type:
+

int

+
+
Returns:
+

The rank of the LocStream.

+
+
+
+ +
+
+property size
+
+
Return type:
+

int

+
+
Returns:
+

The size of the LocStream.

+
+
+
+ +
+
+property upper_bounds
+
+
Return type:
+

int

+
+
Returns:
+

The upper bounds of the LocStream.

+
+
+
+ +
+
+copy()
+

Copy a LocStream in an ESMF-safe manner.

+
+
Returns:
+

A LocStream shallow copy.

+
+
+
+ +
+
+destroy()
+

Release the memory associated with a +LocStream.

+
+ +
+ +
+ + +
+
+
+
+ +
+
+ + + + \ No newline at end of file diff --git a/docs/nightly/fix/reconcile-info/html/manager.html b/docs/nightly/fix/reconcile-info/html/manager.html new file mode 100644 index 00000000..6db922b4 --- /dev/null +++ b/docs/nightly/fix/reconcile-info/html/manager.html @@ -0,0 +1,233 @@ + + + + + + + + Manager — ESMPy 8.8.0b0 documentation + + + + + + + + + + + + + + +
+
+
+
+ +
+

Manager

+
+
+class esmpy.api.esmpymanager.Manager(debug=False, endFlag=<EndAction.NORMAL: 1>)
+

This singleton class is designed to ensure that ESMF is properly initialized +and finalized. ESMF is initialized at +Manager creation, and the __del__ +method is registered with atexit to ensure ESMF is always finalized prior to +exiting Python. If the object is copied, the copy will always be an alias +to the original Manager object. The +Manager will be created when the first +ESMPy object is created if it is not created explicitly by the user.

+

Explicit creation of a Manager object allows +for setting a flag which +results in the output of debug information from the ESMF logging capability +during the application runtime. The output log files are named +PET<PET number>.ESMF_LogFile.

+

The PET rank (local_pet) and total number of PETs (pet_count) +can also be retrieved from the Manager +using the following calls:

+
esmpy.local_pet()
+esmpy.pet_count()
+
+
+

local_pet and pet_count are also properties of the +Manager.

+

Calls ESMP_Initialize and registers __del__ with atexit when called the +first time. Subsequent calls only return whether or not ESMF is +initialized. Registering __del__ with atexit ensures the ESMP_Finalize +will always be called prior to exiting Python. Calling __init__ +explicitly results in a no-op.

+

The Manager can be used to enable the +MOAB +mesh backend to the Mesh. This is done by calling set_moab() with moab_on=True.

+

The Manager has a test_exhaustive member +variable that can be enabled to run +combinatorial expansions of Grid and +Field creation parameters.

+
+
Parameters:
+
    +
  • debug (bool) – outputs logging information to ESMF logfiles. If +None, defaults to False.

  • +
  • endFlag (bool) – determines the action to take on ESMF finalization. +See EndAction docstring for details. Defaults to EndAction.NORMAL.

  • +
+
+
+
+
+property local_pet
+
+
Return type:
+

int

+
+
Returns:
+

The id of the current Persistent Execution Thread (PET i.e. processing core).

+
+
+
+ +
+
+property moab
+
+
Return type:
+

bool

+
+
Returns:
+

A boolean value to indicate if the MOAB mesh backend is in use.

+
+
+
+ +
+
+property pet_count
+
+
Return type:
+

int

+
+
Returns:
+

The number of Persistent Execution Threads (PETs i.e. processing cores) +available in this execution.

+
+
+
+ +
+
+barrier()
+

Collective VM communication call that blocks calling PET until +all PETs of the VM have issued the call.

+
+ +
+
+set_moab(moab_on=True)
+

Set the Mesh backend to use MOAB or the Native ESMF mesh.

+
+ +
+ +
+ + +
+
+
+
+ +
+
+ + + + \ No newline at end of file diff --git a/docs/nightly/fix/reconcile-info/html/mesh.html b/docs/nightly/fix/reconcile-info/html/mesh.html new file mode 100644 index 00000000..645269ae --- /dev/null +++ b/docs/nightly/fix/reconcile-info/html/mesh.html @@ -0,0 +1,464 @@ + + + + + + + + Mesh — ESMPy 8.8.0b0 documentation + + + + + + + + + + + + + + +
+
+
+
+ +
+

Mesh

+
+
+class esmpy.api.mesh.Mesh(parametric_dim=None, spatial_dim=None, coord_sys=None, filename=None, filetype=None, convert_to_dual=None, add_user_area=None, meshname='', mask_flag=None, varname='')
+

The Mesh class is a Python wrapper object for the ESMF Mesh. +The individual values of all coordinate and mask arrays are referenced to +those of the underlying Fortran ESMF object.

+

The ESMF library provides a class for representing unstructured grids called +the Mesh. Fields can be created on a Mesh to hold data. Fields created on a +Mesh can also be used as either the source or destination or both of a +regrididng operation which allows data to be moved between unstructured +grids. A Mesh is constructed of nodes and elements. A node, also known as +a vertex or corner, is a part of a Mesh which represents a single point. +Coordinate information is set in a node. An element, also known as a cell, +is a part of a mesh which represents a small region of space. Elements are +described in terms of a connected set of nodes which represent locations +along their boundaries. Field data may be located on either the nodes or +elements of a Mesh.

+

Refer to the Mesh Class of the +ESMF Reference Manual +for more information.

+

An unstructured Mesh can be created in two different ways, as a Mesh in +memory, or from a SCRIP formatted or CF compliant UGRID file. The arguments +for each type of Mesh creation are outlined below.

+

Created in-memory:

+
+
The in-memory Mesh can be created manually in 3 steps:
    +
  1. create the Mesh (specifying parametric_dim and spatial_dim),

  2. +
  3. add nodes,

  4. +
  5. add elements.

  6. +
+
+
+

REQUIRED:

+
+
Parameters:
+
    +
  • parametric_dim (int) – the dimension of the topology of the +Mesh (e.g. a Mesh composed of squares would have a +parametric dimension of 2 and a Mesh composed of cubes +would have a parametric dimension of 3).

  • +
  • spatial_dim (int) – the number of coordinate dimensions +needed to describe the locations of the nodes making up the +Mesh. For a manifold the spatial dimension can be larger +than the parametric dimension (e.g. the 2D surface of a +sphere in 3D space), but it cannot be smaller.

  • +
+
+
+

OPTIONAL:

+
+
Parameters:
+

coord_sys (CoordSys) – Coordinate system for the +Mesh. +If None, defaults to SPH_DEG.

+
+
+

Created from file:

+

Note that Meshes created from file do not use the parametric_dim and +spatial_dim parameters.

+

REQUIRED:

+
+
Parameters:
+
+
+
+

OPTIONAL:

+
+
Parameters:
+
    +
  • convert_to_dual (bool) – a boolean value to specify if the +dual Mesh should be calculated. Defaults to False. This +argument is only supported with +SCRIP.

  • +
  • add_user_area (bool) – a boolean value to specify if an area +property should be added to the mesh. This argument is only +supported for SCRIP +or ESMFMESH. +If None, defaults to False.

  • +
  • meshname (str) – the name of the Mesh metadata variable in +a UGRID file. This argument is only supported with +UGRID. +If None, defaults to the empty string.

  • +
  • mask_flag (MeshLoc) – an enumerated integer that, if +specified, tells whether a mask in a UGRID file should be +defined on the Mesh. +This argument is only supported with +UGRID. +If None, defaults to no masking.

  • +
  • varname (str) – a variable name for the mask in a UGRID file +if mask_flag is specified. This argument is only supported +for UGRID. +If None, defaults to the empty string.

  • +
+
+
+
+
+property area
+
+
Return type:
+

A two element list of numpy arrays to hold values for the nodes +and elements of the Mesh.

+
+
Returns:
+

The Mesh area represented as a numpy +array of floats of the same number of entries as Mesh elements.

+
+
+
+ +
+
+property coords
+
+
Return type:
+

A two element list of numpy arrays to hold values for the nodes +and elements of the Mesh.

+
+
Returns:
+

The coordinates represented as a numpy array of floats +with a value for each node and/or element of the Mesh +Mesh.

+
+
+
+ +
+
+property coord_sys
+
+
Return type:
+

CoordSys

+
+
Returns:
+

The coordinate system of the Mesh.

+
+
+
+ +
+
+property mask
+
+
Return type:
+

A two element list of numpy arrays to hold values for the nodes +and elements of the Mesh.

+
+
Returns:
+

The masked values on the nodes and elements of the +Mesh.

+
+
+
+ +
+
+property rank
+
+
Return type:
+

int

+
+
Returns:
+

The rank of the Mesh, (i.e. always 1).

+
+
+
+ +
+
+property size
+
+
Return type:
+

A two element list of integers.

+
+
Returns:
+

The number of nodes and elements in the Mesh on the current +processor.

+
+
+
+ +
+
+property size_owned
+
+
Return type:
+

A two element list of integers.

+
+
Returns:
+

The number of owned nodes and elements in the Mesh on the +current processor.

+
+
+
+ +
+
+add_elements(element_count, element_ids, element_types, element_conn, element_mask=None, element_area=None, element_coords=None)
+

Add elements to a Mesh, this must be done after adding nodes.

+

REQUIRED:

+
+
Parameters:
+
    +
  • element_count (int) – the number of elements to add to the Mesh.

  • +
  • element_ids (ndarray) – a numpy array of of shape +(element_count, 1) to specify the element ids.

  • +
  • element_types (ndarray) – a numpy array of +MeshElemType`s of shape +``(element_count, 1)` to specify the element types.

  • +
  • element_conn (ndarray) – a numpy array of shape +sum(element_types[:], 1) to specify the connectivity of the +Mesh. The connectivity array is constructed by concatenating the +tuples that correspond to the element_ids. The connectivity tuples +are constructed by listing the node_ids of each element in +COUNTERCLOCKWISE order.

  • +
+
+
+

OPTIONAL:

+
+
Parameters:
+
    +
  • element_mask (ndarray) – a numpy array of shape +(element_count, 1) containing integer values to specify masked +elements. The specific values that are masked are specified in the +Regrid constructor.

  • +
  • element_area (ndarray) – a numpy array of shape +(element_count, 1) to specify the areas of the elements.

  • +
  • element_coords (ndarray) – a numpy array of shape +(element_count, 1) to specify the coordinates of the elements.

  • +
+
+
+
+ +
+
+add_nodes(node_count, node_ids, node_coords, node_owners, node_mask=None)
+

Add nodes to a Mesh, this must be done before adding elements.

+
+
Parameters:
+
    +
  • node_count (int) – the number of nodes to add to the Mesh.

  • +
  • node_ids (ndarray) – a numpy array of shape (node_count, 1) to +specify the node_ids.

  • +
  • node_coords (ndarray) – a numpy array of shape +(spatial_dim*node_count, 1) to specify the coordinates of the Mesh. +The array should be constructed by concatenating the coordinate +tuples into a numpy array that correspond to node_ids.

  • +
  • node_owners (ndarray) – a numpy array of shape (node_count, 1) to +specify the rank of the processor that owns each node.

  • +
+
+
+

OPTIONAL:

+
+
Parameters:
+

node_mask (ndarray) – a numpy array of shape +(node_count, 1) containing integer values to specify masked +nodes. The specific values that are masked are specified in the +Regrid constructor.

+
+
+
+ +
+
+copy()
+

Copy a Mesh in an ESMF-safe manner.

+
+
Returns:
+

A Mesh shallow copy.

+
+
+
+ +
+
+destroy()
+

Release the memory associated with a Mesh.

+
+ +
+
+free_memory()
+

Free memory associated with the creation of a +Mesh which is no longer needed for ongoing +operations.

+
+ +
+
+get_coords(coord_dim, meshloc=<MeshLoc.NODE: 0>)
+

Return a numpy array of coordinates at a specified Mesh +location (coordinates can only be returned for the Mesh +NODE +at this time). The returned array is NOT a copy, it is +directly aliased to the underlying memory allocated by esmpy.

+

REQUIRED:

+
+
Parameters:
+

coord_dim (int) – the dimension number of the coordinates to return: +e.g. [x, y, z] = (0, 1, 2), or [lat, lon] = (0, 1)

+
+
+

OPTIONAL:

+
+
Parameters:
+

meshloc (MeshLoc) – the MeshLoc of the +coordinates. If None, defaults to +NODE.

+
+
Returns:
+

A numpy array of coordinate values at the specified +MeshLoc.

+
+
+
+ +
+ +
+ + +
+
+
+
+ +
+
+ + + + \ No newline at end of file diff --git a/docs/nightly/fix/reconcile-info/html/objects.inv b/docs/nightly/fix/reconcile-info/html/objects.inv new file mode 100644 index 0000000000000000000000000000000000000000..29b32f42a5d1fbe58b354d01b54b570483763c9e GIT binary patch literal 1766 zcmVNERX>N99Zgg*Qc_4OWa&u{KZXhxWBOp+6Z)#;@bUGkKQ%z8L z3L_v^WpZ8b#rNMXCQiPX<{x4c-pO6%aWTo6y5U`uF7niO1fsIQrQt(c2lv92k4%e6{R+^ zn+hOG;B&AL2BfeVNs^Qecd!&kftn={U<+@OsLKyo9rR z@)l?{fr@P`)Kt(%#&EJB*&Frw&fx9h3i{keXy+}>^}1UfMZqmHY~;9}xiDT<6KguI zwU|oM+9GwSWe}1jWf9K!A-GsY**bDI%av{RTBRtpLC(_zQhAM>9hy%d<;-n!H-XOc zM7{Ll{P?J~(F>%jHYYb|e7;|tMkd#TM}bTl5VipHZi9D-P~FIR3Ry{ zv9{I(GDCqcF413jUaX>Q-B_;&7KaK#*V-a0v)j7URLDiheNxr2$uXcY-?ybjgr%d+ z&i%JrvIO6OR55q&5O6KmSS#{j?(aJmZx>g9SX-Omd6DO)TdxI@oeZ7mzg3l_g39Aoe!eN+C=H?jUC zNY!64V?ikql?x7ejganf=q02$`%4&22+Ph2IuXUMcS=Adygfa|_f{nZow_FMNuyHLkiHYF5mDm#>SZz<|5V};?92CTT23foxd@akGpmjwWO*k@QTL3?hp;!~o>QEX@iesDU`=z!sI*UMsgY_M>zedK>F}t@k2hOnei!t>6rzdA4Kw%&6(5>_BmUg zOhckX97v?&q%`9^BqFd+X)kz%s4)d+ zkmdDf%yH7SiBFKJLhFRdIAtg<##skOh!>HFGFj%8DRZ1SFa?d11_ET9G!PMDB#*ww z#22Kp;^eeCV&(n6`Y=Y(Jr8!Vq35;wQIy>C6j9=kzld`4u|ME_Mp>%Ne<#85ElXjF z-e)QzOGcyorA5ET5AfvxUxX!Yjexw^l@XB_x;{dEt>#f)n)%;+SWrB4UaB3=JZ%hEwye8o=t@j%_rh2KtL%3%WfM`94 z;9$L5{tBDlVRT^i5h);=OLGp=x~B$Ab0f`RT35Igrr+zGt4P3AmyR5UyR$35UvB5x zsP@$jV7W^g4%s;d23&LC%b{9_oq*{aYjVheQ$xUmNAsZE!HX}(&eU>v><1rhKxwN` z%Xd46px72OjgssM+nR&4iq;AQ_mD^3Ws zBZ-g>M(1(}e7=*8R(8sQjg@N`))N#jlXv=mFw5&hix! zpkc=lhHZRdsw-Cff%C!8iU+-IX#K)>X8j`US3usiW>Loj+bg|UvpUqOV@Mv$pG?lG zGfXX?;e+^iz3G2K)0=^Plgs!D~79>}D + + + + + + Python Module Index — ESMPy 8.8.0b0 documentation + + + + + + + + + + + + + + + + + +
+
+
+
+ + +

Python Module Index

+ +
+ e +
+ + + + + + + +
 
+ e
+ esmpy +
+ + +
+
+
+
+ +
+
+ + + + \ No newline at end of file diff --git a/docs/nightly/fix/reconcile-info/html/regrid.html b/docs/nightly/fix/reconcile-info/html/regrid.html new file mode 100644 index 00000000..05e5dd32 --- /dev/null +++ b/docs/nightly/fix/reconcile-info/html/regrid.html @@ -0,0 +1,366 @@ + + + + + + + + Regrid — ESMPy 8.8.0b0 documentation + + + + + + + + + + + + + + +
+
+
+
+ +
+

Regrid

+
+
+class esmpy.api.regrid.Regrid(srcfield=None, dstfield=None, filename=None, rh_filename=None, src_mask_values=None, dst_mask_values=None, regrid_method=None, pole_method=None, regrid_pole_npoints=None, line_type=None, norm_type=None, extrap_method=None, extrap_num_src_pnts=None, extrap_dist_exponent=None, extrap_num_levels=None, unmapped_action=None, ignore_degenerate=None, create_rh=None, filemode=None, src_file=None, dst_file=None, src_file_type=None, dst_file_type=None, factors=False, large_file=None, src_frac_field=None, dst_frac_field=None)
+

The Regrid object represents a regridding operator between two Fields. The +creation of this object is analogous to ESMF_FieldRegridStore(), and +calling this object corresponds to ESMF_FieldRegrid(). +ESMF_FieldRegridRelease() is called when the Regrid object goes out of +scope (this only happens when the Manager goes out of scope, there is a +destroy() call for explicit deallocation of the Regrid).

+

Refer to the ESMF_FieldRegrid methods in the +ESMF Reference Manual +for more information.

+

The following arguments are used to create a handle to a Regridding +operation between two Fields.

+

REQUIRED:

+
+
Parameters:
+
+
+
+

OPTIONAL:

+
+
Parameters:
+
    +
  • filename (string) – path to the output netCDF weight file.

  • +
  • rh_filename (string) – path to the output RouteHandle file.

  • +
  • src_mask_values (ndarray) – a numpy array of values that should be +considered masked value on the source Field.

  • +
  • dst_mask_values (ndarray) – a numpy array of values that should be +considered masked value on the destination Field.

  • +
  • regrid_method (RegridMethod) – specifies which +RegridMethod to use. If None, defaults +to BILINEAR.

  • +
  • pole_method (PoleMethod) – specifies which type of artificial pole +to construct on the source Grid for regridding. If +None, defaults to: NONE for +regridmethod == CONSERVE, or +ALLAVG for +regridmethod != CONSERVE.

  • +
  • regrid_pole_npoints (int) – specifies how many points to average over +if polemethod == ALLAVG.

  • +
  • line_type (LineType) – select the path of the line that connects two +points on the surface of a sphere. This in turn controls the path along +which distances are calculated and the shape of the edges that make up a +cell. If None, defaults to: +GREAT_CIRCLE for +regridmethod == CONSERVE, or +CART for +regridmethod != CONSERVE.

  • +
  • norm_type (NormType) – control which type of normalization to do when +generating conservative regridding weights. If None, defaults to +DSTAREA.

  • +
  • extrap_method (ExtrapMethod) – Specify which extrapolation method to use on +unmapped destination points after regridding.

  • +
  • extrap_num_src_pnts (int) – The number of source points to use for the +extrapolation methods that use more than one source point +(e.g. NEAREST_IDAVG). If not +specified, defaults to 8.

  • +
  • extrap_dist_exponent (float) – The exponent to raise the distance to when +calculating weights for the NEAREST_IDAVG +extrapolation method. A higher value reduces the influence of more distant +points. If not specified, defaults to 2.0.

  • +
  • extrap_num_levels (int) – The number of levels to output for the extrapolation +methods that fill levels (e.g. CREEP). +When a method is used that requires this, then an error will be returned if it +is not specified.

  • +
  • unmapped_action (UnmappedAction) – specifies which action to take if a +destination point is found which does not map to any source point. If +None, defaults to ERROR.

  • +
  • ignore_degenerate (bool) – Ignore degenerate cells when checking the +input Grids or Meshes +for errors. If this is set to True, then the regridding proceeds, but +degenerate cells will be skipped. If set to False, a degenerate cell produces +an error. This currently only applies to CONSERVE, +other regrid methods currently always skip degenerate cells. If None, defaults +to False.

  • +
  • src_frac_field (ndarray) – return a numpy array of values containing +weights corresponding to the amount of each Field +value which contributes to the total mass of the Field.

  • +
  • dst_frac_field (ndarray) – return a numpy array of values containing +weights corresponding to the amount of each Field +value which contributes to the total mass of the Field.

  • +
  • factors (bool) –

    If True, return the factor and factor index list +when calling into ESMF’s regrid store method. These lists are converted +to NumPy arrays and attached to the regrid object. The factor arrays +are retrievable via get_factors() or get_weights_dict(). +See the respective documentation on those methods for additional information. +For more information on how ESMF treats factor retrieval see the +ESMF_FieldRegridStore interface in the +ESMF Reference Manual.

    +

  • +
  • large_file (bool) – If True, create the weight file in NetCDF using the +64-bit offset format to allow variables larger than 2GB. Note the 64-bit offset +format is not supported in the NetCDF version earlier than 3.6.0. An error message +will be generated if this flag is specified while the application is linked with a +NetCDF library earlier than 3.6.0. Defaults to False.

  • +
+
+
+
+
+__call__(srcfield, dstfield, zero_region=None)
+

Call a regridding operation from srcfield to dstfield.

+

REQUIRED:

+
+
Parameters:
+
    +
  • srcfield (Field) – the Field of source data to regrid.

  • +
  • dstfield (Field) – the Field to hold the regridded data.

  • +
+
+
+

OPTIONAL:

+
+
Parameters:
+

zero_region (Region) – specify which region of the field indices +will be zeroed out before adding the values resulting from the +interpolation. If None, defaults to +TOTAL.

+
+
Returns:
+

dstfield

+
+
+
+ +
+
+copy()
+

Copy a Regrid in an ESMF-safe manner.

+
+
Returns:
+

A Regrid shallow copy.

+
+
+
+ +
+
+destroy()
+

Release the memory associated with a Regrid.

+
+ +
+
+get_factors(deep_copy=False)
+

Return factor and factor index arrays. These arrays will only be +available if the Regrid object was initialized with factors=True. +See the ESMF_FieldRegridStore interface in the +ESMF Reference Manual +for additional information on these arrays (see below for indexing in +Python though).

+
>>> factors, factors_index = get_factors(...)
+
+
+

The first tuple element factors will have shape (m,) where +m is the number of factors or weights. It will be dtype(float64). +The second tupe element factors_index will have shape (m, 2) +where m is the number of factors or weights. The source/col indices +are selected by factors_index[:, 0]. The destination/row indices +are selected by factors_index[:, 1]. It will be dtype(int32).

+
+

Note

+

If deep_copy=True, array memory is C contiguous according +to NumPy array flags (<array>.flags).

+
+
+

Warning

+

Remember to call destroy() to deallocate +memory associated with a regrid operation. This will be called by +the Python garbage collector. However, if numerous regridding operations +are called in a tight loop, a memory leak will occur without a call +to destroy.

+
+
+
Parameters:
+

deep_copy (bool) – If True, make deep copies of the returned +arrays. If False (the default), the returned arrays will reference +the underlying ESMF memory.

+
+
Returns:
+

tuple of NumPy array objects

+
+
+
+ +
+
+get_weights_dict(deep_copy=False)
+

Return a dictionary mapping that is more user-friendly for weight/factor +retrieval. Please read the documentation for get_factors() +before using this function.

+ + + + + + + + + + + + + + + + + +

Key

Value

weights

Weight value array

row_dst

Destination/row indices

col_src

Source/col indices

+
+

Note

+

If deep_copy=True, array memory is C contiguous according +to NumPy array flags (<array>.flags).

+
+
+
Parameters:
+

deep_copy (bool) – If True, make deep copies of the returned +arrays. If False (the default), the returned arrays will reference +the underlying ESMF memory.

+
+
Returns:
+

dict

+
+
+
+ +
+ +
+ + +
+
+
+
+ +
+
+ + + + \ No newline at end of file diff --git a/docs/nightly/fix/reconcile-info/html/regridfromfile.html b/docs/nightly/fix/reconcile-info/html/regridfromfile.html new file mode 100644 index 00000000..b7e0bddd --- /dev/null +++ b/docs/nightly/fix/reconcile-info/html/regridfromfile.html @@ -0,0 +1,210 @@ + + + + + + + + RegridFromFile — ESMPy 8.8.0b0 documentation + + + + + + + + + + + + + + +
+
+
+
+ +
+

RegridFromFile

+
+
+class esmpy.api.regrid.RegridFromFile(srcfield, dstfield, filename=None, rh_filename=None)
+

The RegridFromFile object represents a regridding +operator between two Fields that is read +from a file. The creation of this object is analogous to= ESMF_FieldSMMStore(), +and calling this object corresponds to ESMF_FieldRegrid(). ESMF_FieldRegridRelease() +is called when the RegridFromFile object goes +out of scope (this only happens when the Manager +goes out of scope, there is a destroy() call for explicit deallocation of +the RegridFromFile).

+

For more information about the ESMF Regridding functionality, please see +the ESMF_FieldRegrid methods in the +ESMF Reference Manual.

+

The following arguments are used to create a handle to a regridding +operation between two Fields.

+

REQUIRED:

+
+
Parameters:
+
    +
  • srcfield (Field) – source Field associated +with an underlying Grid, Mesh +or LocStream.

  • +
  • dstfield (Field) – destination Field associated +with an underlying Grid, Mesh +or LocStream. The data in this Field +may be overwritten by this call.

  • +
  • filename (string) – the name of the file from which to retrieve the +weights.

  • +
  • rh_filename (string) – the name of the file from which to retrieve the +routehandle information.

  • +
+
+
+
+
+__call__(srcfield, dstfield, zero_region=None)
+

Call a regridding operation from srcfield to dstfield.

+

REQUIRED:

+
+
Parameters:
+
    +
  • srcfield (Field) – the Field of source data to regrid.

  • +
  • dstfield (Field) – the Field to hold the regridded data.

  • +
+
+
+

OPTIONAL:

+
+
Parameters:
+

zero_region (Region) – specify which region of the field indices +will be zeroed out before adding the values resulting from the +interpolation. If None, defaults to +TOTAL.

+
+
Returns:
+

dstfield

+
+
+
+ +
+
+copy()
+

Copy a Regrid in an ESMF-safe manner.

+
+
Returns:
+

A Regrid shallow copy.

+
+
+
+ +
+
+destroy()
+

Release the memory associated with the RegridFromFile +object.

+
+ +
+ +
+ + +
+
+
+
+ +
+
+ + + + \ No newline at end of file diff --git a/docs/nightly/fix/reconcile-info/html/search.html b/docs/nightly/fix/reconcile-info/html/search.html new file mode 100644 index 00000000..a3f965a8 --- /dev/null +++ b/docs/nightly/fix/reconcile-info/html/search.html @@ -0,0 +1,102 @@ + + + + + + + Search — ESMPy 8.8.0b0 documentation + + + + + + + + + + + + + + + + + + +
+
+
+
+ +

Search

+ + + + +

+ Searching for multiple words only shows matches that contain + all words. +

+ + +
+ + + +
+ + + +
+ +
+ + +
+
+
+
+ +
+
+ + + + \ No newline at end of file diff --git a/docs/nightly/fix/reconcile-info/html/searchindex.js b/docs/nightly/fix/reconcile-info/html/searchindex.js new file mode 100644 index 00000000..c1944f88 --- /dev/null +++ b/docs/nightly/fix/reconcile-info/html/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"docnames": ["CoordSys", "ExtrapMethod", "FileFormat", "FileMode", "GridItem", "LineType", "LogKind", "MeshElemType", "MeshLoc", "NormType", "PoleKind", "PoleMethod", "Region", "RegridMethod", "StaggerLoc", "TypeKind", "UnmappedAction", "api", "appendix", "examples", "field", "grid", "index", "install", "intro", "locstream", "manager", "mesh", "regrid", "regridfromfile"], "filenames": ["CoordSys.rst", "ExtrapMethod.rst", "FileFormat.rst", "FileMode.rst", "GridItem.rst", "LineType.rst", "LogKind.rst", "MeshElemType.rst", "MeshLoc.rst", "NormType.rst", "PoleKind.rst", "PoleMethod.rst", "Region.rst", "RegridMethod.rst", "StaggerLoc.rst", "TypeKind.rst", "UnmappedAction.rst", "api.rst", "appendix.rst", "examples.rst", "field.rst", "grid.rst", "index.rst", "install.rst", "intro.rst", "locstream.rst", "manager.rst", "mesh.rst", "regrid.rst", "regridfromfile.rst"], "titles": ["CoordSys", "ExtrapMethod", "FileFormat", "FileMode", "GridItem", "LineType", "LogKind", "MeshElemType", "MeshLoc", "NormType", "PoleKind", "PoleMethod", "Region", "RegridMethod", "StaggerLoc", "TypeKind", "UnmappedAction", "API", "Appendices", "Tutorials", "Field", "Grid", "Table of Contents", "Installation", "Overview", "LocStream", "Manager", "Mesh", "Regrid", "RegridFromFile"], "terms": {"class": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29], "esmpi": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 20, 21, 22, 24, 25, 26, 27, 28, 29], "api": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 19, 20, 21, 22, 23, 25, 26, 27, 28, 29], "constant": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 19, 22], "valu": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 19, 20, 21, 23, 24, 25, 26, 27, 28, 29], "name": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 19, 20, 21, 22, 23, 25, 26, 27, 29], "none": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 18, 19, 20, 21, 25, 26, 27, 28, 29], "modul": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 22, 23], "type": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 25, 26, 27, 28], "start": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 19], "1": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 21, 23, 25, 26, 27, 28], "thi": [0, 1, 2, 4, 5, 6, 9, 10, 11, 12, 13, 15, 16, 17, 19, 20, 21, 23, 24, 25, 26, 27, 28, 29], "flag": [0, 2, 6, 17, 26, 28], "indic": [0, 1, 2, 3, 11, 15, 16, 17, 23, 26, 28, 29], "coordin": [0, 3, 4, 13, 14, 18, 19, 20, 21, 23, 24, 25, 27], "system": [0, 17, 19, 21, 24, 25, 27], "grid": [0, 2, 3, 4, 5, 9, 10, 11, 13, 14, 18, 20, 22, 23, 24, 26, 27, 28, 29], "i": [0, 1, 4, 5, 6, 7, 9, 10, 11, 12, 13, 14, 15, 16, 17, 19, 20, 21, 23, 24, 25, 26, 27, 28, 29], "us": [0, 1, 2, 3, 4, 6, 7, 8, 9, 11, 12, 13, 15, 16, 17, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29], "both": [0, 5, 17, 19, 23, 24, 27], "other": [0, 4, 9, 17, 23, 24, 25, 28], "user": [0, 1, 9, 17, 20, 21, 23, 26, 28], "also": [0, 1, 3, 9, 13, 17, 21, 24, 26, 27], "control": [0, 5, 17, 25, 28], "how": [0, 5, 6, 17, 19, 20, 24, 28], "ar": [0, 1, 5, 7, 9, 11, 12, 13, 16, 17, 19, 20, 21, 23, 24, 25, 26, 27, 28, 29], "interpret": [0, 17], "regrid": [0, 1, 4, 5, 9, 11, 12, 13, 18, 21, 22, 23, 24, 27, 29], "method": [0, 1, 5, 13, 14, 17, 24, 26, 28, 29], "e": [0, 1, 11, 17, 20, 21, 25, 26, 27, 28], "g": [0, 1, 11, 17, 20, 21, 27, 28], "cart": [0, 5, 18, 19, 25, 28], "0": [0, 1, 3, 4, 5, 8, 9, 10, 11, 12, 13, 14, 16, 17, 19, 21, 23, 25, 27, 28], "cartesian": [0, 5, 17, 19, 24, 25], "In": [0, 9, 13, 14, 17, 24, 25], "map": [0, 1, 11, 12, 13, 20, 21, 24, 28], "dimens": [0, 7, 14, 19, 20, 21, 22, 25, 27], "follow": [0, 5, 7, 17, 19, 20, 23, 25, 26, 28, 29], "order": [0, 13, 19, 22, 24, 27], "x": [0, 17, 19, 21, 25, 27], "y": [0, 17, 19, 21, 25, 27], "z": [0, 17, 19, 21, 25, 27], "coord_dim": [0, 21, 27], "get_coord": [0, 17, 18, 19, 21, 27], "refer": [0, 4, 17, 20, 21, 22, 23, 24, 25, 27, 28, 29], "sph_deg": [0, 17, 18, 19, 21, 25, 27], "spheric": [0, 18, 21, 24], "degre": [0, 17, 24], "longitud": [0, 17, 19, 21], "latitud": [0, 17, 19, 21], "radiu": [0, 17, 25], "sph_rad": [0, 17, 18, 19, 25], "2": [0, 1, 2, 6, 10, 11, 12, 13, 14, 17, 19, 21, 25, 27, 28], "radian": [0, 17, 19], "specifi": [1, 3, 5, 6, 12, 13, 14, 17, 19, 20, 21, 25, 27, 28, 29], "which": [1, 3, 5, 7, 9, 11, 13, 17, 19, 20, 21, 24, 26, 27, 28, 29], "extrapol": [1, 17, 24, 28], "unmap": [1, 16, 17, 24, 28], "destin": [1, 9, 11, 13, 16, 17, 19, 24, 27, 28, 29], "point": [1, 5, 11, 13, 16, 17, 23, 24, 25, 27, 28], "after": [1, 13, 17, 27, 28], "should": [1, 3, 6, 12, 17, 19, 23, 27, 28], "done": [1, 6, 9, 17, 23, 26, 27], "nearest_stod": [1, 13, 17, 18], "nearest": [1, 13, 17, 24], "sourc": [1, 9, 11, 13, 17, 19, 22, 24, 27, 28, 29], "here": [1, 9, 11, 17, 23], "each": [1, 7, 11, 13, 17, 19, 20, 21, 25, 27, 28], "closest": [1, 13], "A": [1, 4, 7, 13, 15, 17, 18, 19, 20, 21, 23, 25, 26, 27, 28, 29], "given": [1, 9, 10, 13, 17, 19, 21], "mai": [1, 2, 4, 11, 13, 17, 21, 24, 27, 28, 29], "go": [1, 13], "multipl": [1, 6, 13, 17, 20, 21, 24], "receiv": [1, 13, 17], "input": [1, 13, 17, 27, 28], "from": [1, 2, 7, 11, 13, 14, 20, 21, 22, 24, 25, 26, 27, 28, 29], "more": [1, 13, 17, 20, 21, 23, 24, 25, 27, 28, 29], "than": [1, 13, 17, 21, 23, 24, 27, 28], "one": [1, 6, 13, 17, 19, 20, 21, 23, 24, 28], "nearest_idavg": [1, 18, 28], "invers": 1, "distanc": [1, 5, 13, 28], "weight": [1, 3, 5, 9, 13, 17, 22, 23, 24, 28, 29], "averag": [1, 11, 13, 17, 28], "n": [1, 10, 11, 17, 19, 23], "The": [1, 2, 4, 7, 8, 11, 13, 17, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29], "reciproc": 1, "rais": [1, 17, 19, 28], "power": [1, 17], "p": 1, "all": [1, 5, 11, 17, 19, 20, 21, 24, 25, 26, 27], "contribut": [1, 19, 24, 28], "normal": [1, 9, 17, 26, 28], "so": [1, 13, 17, 19, 21, 24], "thei": [1, 17, 25], "sum": [1, 13, 19, 21, 27], "can": [1, 4, 5, 7, 11, 14, 17, 19, 20, 21, 23, 24, 25, 26, 27], "choos": [1, 24], "when": [1, 3, 5, 9, 13, 14, 17, 20, 23, 24, 26, 28, 29], "default": [1, 5, 17, 20, 21, 23, 25, 26, 27, 28, 29], "provid": [1, 13, 17, 21, 24, 27], "creep_fil": [1, 18], "3": [1, 2, 6, 7, 11, 13, 14, 15, 17, 19, 21, 23, 25, 27, 28], "creep": [1, 28], "fill": [1, 11, 28], "repeatedli": 1, "move": [1, 27], "data": [1, 2, 4, 8, 12, 14, 17, 18, 19, 20, 21, 23, 24, 25, 27, 28, 29], "locat": [1, 8, 13, 14, 17, 19, 20, 21, 23, 25, 27], "neighbor": [1, 13, 24], "new": [1, 11, 19], "its": [1, 13, 17, 20], "alreadi": [1, 21, 23], "process": [1, 17, 19, 24, 26], "repeat": 1, "number": [1, 11, 17, 19, 20, 21, 23, 25, 26, 27, 28], "level": [1, 17, 23, 28], "via": [1, 28], "extrap_num_level": [1, 28], "paramet": [1, 11, 17, 20, 21, 25, 26, 27, 28, 29], "support": [1, 17, 20, 21, 23, 24, 27, 28], "conserv": [1, 4, 5, 9, 13, 17, 18, 19, 21, 23, 24, 28], "mesh": [2, 7, 8, 9, 13, 18, 20, 22, 23, 24, 26, 28, 29], "object": [2, 12, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29], "creat": [2, 13, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29], "specif": [2, 17, 23, 27], "netcdf": [2, 17, 20, 21, 23, 24, 27, 28], "file": [2, 3, 6, 20, 21, 22, 23, 24, 26, 27, 28, 29], "format": [2, 19, 21, 22, 24, 27, 28], "vtk": [2, 18], "scrip": [2, 18, 19, 21, 24, 27], "esmfmesh": [2, 18, 19, 27], "unstructur": [2, 17, 19, 24, 27], "esmfgrid": [2, 18], "4": [2, 7, 13, 14, 15, 17, 18, 19, 21, 23], "esmf": [2, 15, 17, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29], "structur": [2, 17], "ugrid": [2, 18, 24, 27], "5": [2, 13, 14, 15, 17, 22], "gridspec": [2, 18, 19, 21, 24], "6": [2, 7, 14, 15, 17, 19, 21, 23, 24, 28], "singl": [2, 17, 20, 21, 23, 24, 27], "tile": [2, 21, 23, 24], "base": [2, 13, 17], "cf": [2, 17, 19, 20, 21, 24, 27], "v1": [2, 24], "convent": [2, 17, 20, 24], "k": [2, 19, 24], "mode": [3, 17], "write": [3, 22, 23], "basic": [3, 18, 23, 24], "onli": [3, 5, 13, 17, 19, 20, 21, 23, 26, 27, 28, 29], "factorlist": 3, "factorindexlist": 3, "written": [3, 23], "withaux": [3, 18], "center": [3, 11, 13, 14, 17, 18, 19, 20, 21], "cell": [3, 5, 9, 13, 14, 19, 20, 21, 22, 24, 27, 28], "area": [3, 4, 9, 18, 19, 20, 21, 24, 27], "contain": [4, 13, 17, 19, 20, 21, 23, 27, 28], "kind": [4, 15, 17, 24], "besid": [4, 17, 25], "item": [4, 17, 20, 21], "some": [4, 11, 17, 21, 23], "calcul": [4, 5, 9, 13, 17, 19, 21, 24, 27, 28], "involv": [4, 17, 19], "mask": [4, 18, 19, 21, 22, 24, 25, 27, 28], "repres": [4, 17, 20, 21, 24, 25, 27, 28, 29], "an": [4, 11, 12, 15, 16, 17, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29], "field": [4, 8, 12, 13, 17, 18, 22, 23, 24, 25, 26, 27, 28, 29], "argument": [5, 17, 19, 20, 21, 25, 27, 28, 29], "path": [5, 17, 19, 23, 24, 28], "line": [5, 17, 24, 28], "connect": [5, 10, 17, 19, 21, 27, 28], "two": [5, 17, 19, 21, 24, 27, 28, 29], "surfac": [5, 17, 27, 28], "sphere": [5, 11, 17, 21, 23, 24, 27, 28], "turn": [5, 28], "along": [5, 17, 27, 28], "shape": [5, 17, 19, 27, 28], "edg": [5, 10, 14, 17, 28], "make": [5, 17, 19, 23, 25, 27, 28], "up": [5, 17, 23, 27, 28], "quantiti": [5, 17], "influenc": [5, 17, 28], "interpol": [5, 11, 13, 17, 18, 19, 24, 28, 29], "As": [5, 17], "would": [5, 17, 27], "expect": [5, 17], "applic": [5, 17, 23, 24, 26, 28], "lie": [5, 11], "option": [5, 9, 11, 17, 19, 20, 21, 23, 24, 25, 27, 28, 29], "straight": [5, 17, 24], "through": [5, 17, 21, 23, 24], "3d": [5, 7, 14, 17, 20, 21, 22, 24, 27], "space": [5, 17, 21, 24, 27], "embed": [5, 17], "approxim": [5, 13], "plane": [5, 17], "bound": [5, 19, 20, 21, 25], "between": [5, 11, 13, 17, 19, 24, 27, 28, 29], "corner": [5, 13, 14, 17, 18, 19, 20, 21, 27], "vertic": [5, 14], "current": [5, 13, 17, 20, 26, 27, 28], "except": [5, 17, 19], "great_circl": [5, 18, 28], "great": [5, 22, 24], "circl": [5, 22, 24], "shortest": 5, "much": [6, 13, 17], "log": [6, 19, 22, 26], "multi": [6, 17, 18, 23], "per": [6, 17, 20], "pet": [6, 17, 19, 21, 26], "do": [6, 9, 17, 19, 27, 28], "issu": [6, 19, 23, 24, 26], "messag": [6, 17, 28], "construct": [7, 11, 13, 17, 25, 27, 28], "combin": [7, 13, 17], "differ": [7, 11, 13, 14, 17, 19, 20, 21, 24, 27], "element": [7, 8, 10, 12, 13, 17, 18, 21, 22, 23, 27, 28], "depend": [7, 25], "parametr": [7, 17, 19, 27], "set": [7, 11, 14, 17, 19, 21, 23, 24, 25, 26, 27, 28], "dure": [7, 13, 17, 26], "creation": [7, 21, 26, 27, 28, 29], "valid": [7, 17, 22, 25], "2d": [7, 13, 14, 17, 20, 21, 22, 24, 27], "tri": [7, 17, 18, 19], "triangular": 7, "side": [7, 17, 21], "quad": [7, 17, 18, 19], "quadrilater": [7, 17], "tetra": [7, 18], "10": [7, 17, 19], "tetrahedr": 7, "face": [7, 14], "hex": [7, 18], "12": [7, 17, 19, 21], "hexahedr": 7, "hold": [8, 17, 19, 27, 28, 29], "node": [8, 11, 17, 18, 19, 20, 27], "allow": [9, 17, 23, 26, 27, 28], "select": [9, 12, 17, 18, 19, 28], "produc": [9, 24, 28], "dstarea": [9, 18, 28], "divid": 9, "overlap": [9, 13, 24], "entir": [9, 11, 17, 23], "word": [9, 17], "fraction": [9, 19], "fracarea": [9, 18], "addit": [9, 17, 28], "just": 9, "part": [9, 17, 27], "describ": [10, 17, 21, 24, 25, 27], "occur": [10, 11, 21, 28], "pole": [10, 11, 21, 24, 28], "No": [10, 11], "monopol": [10, 18, 21], "itself": 10, "long": [10, 17], "bipol": [10, 18], "artifici": [11, 17, 28], "abov": [11, 23], "top": [11, 14, 17, 23], "below": [11, 21, 27, 28], "bottom": [11, 14], "row": [11, 28], "won": [11, 17], "t": [11, 17, 23], "allavg": [11, 18, 28], "place": [11, 17, 24], "project": [11, 24], "onto": [11, 20], "form": [11, 17], "rest": 11, "surround": [11, 13], "npntavg": [11, 18], "next": 11, "regridpolenpnt": 11, "rang": [11, 13, 17, 19, 23], "around": [11, 17], "zero": [11, 17, 19, 28, 29], "out": [11, 17, 24, 28, 29], "vector": 11, "compon": [11, 23, 24], "teeth": [11, 18], "instead": [11, 17, 23], "hole": 11, "triangl": [11, 17], "across": [11, 13, 17, 21, 24], "becaus": [11, 13, 17], "howev": [11, 13, 17, 19, 28], "now": [11, 17], "flat": 11, "big": 11, "enough": 11, "mismatch": [11, 25], "size": [11, 17, 18, 19, 21, 25, 27], "still": [11, 17], "abl": [11, 25], "variou": [12, 17, 24], "layout": [12, 17], "total": [12, 17, 18, 21, 26, 28, 29], "oper": [12, 17, 19, 21, 24, 27, 28, 29], "appli": [12, 17, 19, 23, 28], "everi": [12, 21], "domain": [12, 24], "portion": [12, 17], "One": [12, 17], "retain": 12, "origin": [12, 17, 24, 26], "oppos": 12, "being": [12, 17], "initi": [12, 17, 20, 22, 26, 28], "empti": [12, 18, 27], "doe": [12, 13, 17, 19, 20, 28], "ani": [12, 17, 19, 23, 24, 25, 28], "bilinear": [13, 17, 18, 19, 24, 28], "linear": [13, 17, 24], "patch": [13, 17, 18, 24], "higher": [13, 17, 24, 28], "recoveri": [13, 24], "polynomi": [13, 24], "typic": 13, "result": [13, 16, 17, 19, 24, 25, 26, 28, 29], "better": [13, 17, 24], "deriv": [13, 21, 24, 25], "larger": [13, 27, 28], "stencil": 13, "matrix": [13, 16, 19, 24], "thu": [13, 17], "routehandl": [13, 28, 29], "first": [13, 14, 17, 21, 23, 24, 26, 28], "main": [13, 19], "purpos": 13, "preserv": [13, 24], "integr": [13, 17, 23, 24], "treat": [13, 28], "have": [13, 17, 19, 20, 21, 26, 27, 28], "error": [13, 16, 18, 19, 25, 28], "determin": [13, 19, 21, 24, 26], "amount": [13, 28], "requir": [13, 17, 20, 21, 22, 27, 28, 29], "It": [13, 17, 21, 24, 28], "work": [13, 17, 19, 23], "": [13, 17, 23, 27, 28], "stagger": [13, 14, 19, 20, 21], "version": [13, 23, 24, 28], "nearest_dto": [13, 17, 18, 19], "conserve_2nd": [13, 17, 18], "second": [13, 14, 17, 21, 24, 25, 28], "take": [13, 16, 17, 23, 24, 26, 28], "gradient": [13, 24], "account": [13, 19], "yield": 13, "smoother": [13, 24], "match": 13, "particularli": 13, "appar": 13, "coars": 13, "finer": 13, "anoth": [13, 17], "guarante": 13, "within": [13, 17, 25], "For": [13, 17, 21, 25, 27, 28, 29], "exampl": [13, 17, 19, 23, 25], "mininum": 13, "possibl": [13, 17], "less": [13, 17, 21], "posit": [14, 17, 25], "retriev": [14, 17, 19, 23, 26, 28, 29], "tell": [14, 19, 21, 27], "where": [14, 17, 19, 21, 28], "get": [14, 19, 22], "edge1": [14, 18], "edge2": [14, 18], "center_vcent": [14, 18, 19, 20, 21], "edge1_vcent": [14, 18], "edge2_vcent": [14, 18], "corner_vcent": [14, 18], "center_vfac": [14, 18], "edge1_vfac": [14, 18], "edge2_vfac": [14, 18], "corner_vfac": [14, 18, 19], "7": [14, 17, 19, 23], "underli": [15, 17, 20, 21, 25, 27, 28, 29], "librari": [15, 17, 23, 25, 27, 28], "routin": [15, 17], "i4": [15, 18, 25], "four": [15, 17], "byte": 15, "integ": [15, 17, 21, 27], "equival": [15, 17], "numpi": [15, 19, 21, 22, 23, 27, 28], "int32": [15, 17, 19, 28], "i8": [15, 18], "eight": 15, "int64": 15, "r4": [15, 18], "real": 15, "float32": 15, "r8": [15, 18, 19, 20, 21, 25], "float64": [15, 28], "what": 16, "action": [16, 17, 26, 28], "respect": [16, 17, 28], "entri": [16, 17, 20, 21, 27], "spars": [16, 24], "correspond": [16, 17, 24, 27, 28, 29], "code": [16, 17, 19, 21, 22], "return": [16, 19, 20, 21, 25, 26, 27, 28, 29], "ignor": [16, 17, 18, 19, 24, 28], "variabl": [17, 19, 20, 21, 23, 26, 27, 28], "built": [17, 19, 20, 23], "accomplish": 17, "explain": 17, "detail": [17, 23, 26], "section": 17, "link": [17, 22, 23, 28], "tabl": 17, "descript": [17, 21], "final": [17, 26], "logic": [17, 21, 24], "rectangular": [17, 21, 24], "observ": [17, 24, 25], "collect": [17, 24, 26], "disconnect": [17, 19], "util": [17, 19, 24], "regridfromfil": [17, 18, 19, 22], "avail": [17, 19, 21, 23, 24, 26, 28], "varieti": [17, 24], "list": [17, 19, 20, 21, 23, 25, 27, 28], "page": [17, 22, 24], "further": 17, "coordsi": [17, 18, 19, 21, 22, 25, 27], "extrapmethod": [17, 18, 22, 28], "fileformat": [17, 18, 19, 21, 22, 27], "filemod": [17, 18, 22, 28], "griditem": [17, 18, 19, 21, 22], "linetyp": [17, 18, 22, 28], "logkind": [17, 18, 22], "meshelemtyp": [17, 18, 19, 22, 27], "meshloc": [17, 18, 19, 20, 22, 27], "nodal": 17, "normtyp": [17, 18, 22, 28], "polekind": [17, 18, 21, 22], "appear": 17, "polemethod": [17, 18, 22, 28], "region": [17, 18, 19, 21, 22, 24, 27, 28, 29], "regridmethod": [17, 18, 19, 22, 28], "staggerloc": [17, 18, 19, 20, 21, 22], "typekind": [17, 18, 19, 20, 21, 22], "unmappedact": [17, 18, 19, 22, 28], "simplifi": 17, "low": 17, "call": [17, 19, 24, 25, 26, 27, 28, 29], "framework": [17, 24], "enabl": [17, 19, 26], "garbag": [17, 28], "virtual": 17, "machin": [17, 19, 23], "vm": [17, 26], "begin": 17, "inform": [17, 20, 21, 23, 24, 25, 26, 27, 28, 29], "about": [17, 29], "topologi": [17, 21, 27], "characterist": 17, "comput": [17, 21, 22], "persist": [17, 26], "thread": [17, 26], "These": [17, 19, 24, 28], "lifetim": 17, "least": [17, 20, 24], "simplest": 17, "most": [17, 21], "common": [17, 19, 23], "case": [17, 19], "queri": 17, "mg": [17, 19], "pet_count": [17, 18, 19, 26], "local_pet": [17, 18, 19, 26], "manual": [17, 20, 21, 23, 24, 25, 27, 28, 29], "debug": [17, 19, 26], "true": [17, 19, 21, 25, 26, 28], "output": [17, 19, 23, 26, 28], "esmf_logfil": [17, 26], "need": [17, 19, 20, 23, 24, 25, 27], "onc": 17, "handl": [17, 19, 24, 28, 29], "intern": [17, 21, 25], "explicit": [17, 26, 28, 29], "intervent": 17, "featur": 17, "trigger": 17, "until": [17, 26], "invok": [17, 23], "happen": [17, 28, 29], "goe": [17, 28, 29], "scope": [17, 28, 29], "end": [17, 21, 23], "program": [17, 19, 23], "If": [17, 20, 21, 23, 25, 26, 27, 28, 29], "dealloc": [17, 28, 29], "prior": [17, 26], "destroi": [17, 18, 20, 21, 25, 27, 28, 29], "commonli": [17, 24], "reus": 17, "mani": [17, 21, 23, 24, 28], "pair": 17, "set_moab": [17, 18, 26], "moab_on": [17, 26], "altern": 17, "nativ": [17, 26], "yet": 17, "full": 17, "There": [17, 23, 24, 25], "three": 17, "represent": 17, "polygon": 17, "individu": [17, 20, 21, 25, 27], "nearli": 17, "ident": 17, "counterpart": 17, "same": [17, 20, 21, 27], "simplif": 17, "eas": 17, "python": [17, 20, 21, 22, 23, 24, 25, 26, 27, 28], "environ": [17, 23], "geometri": [17, 21], "physic": [17, 20, 21], "like": [17, 19, 23, 24], "finit": 17, "techniqu": 17, "includ": [17, 23, 24, 25], "count": [17, 19, 21], "assumpt": [17, 25], "suffici": [17, 21], "arakawa": 17, "shortcut": 17, "standard": [17, 25], "interfac": [17, 20, 22, 23, 24, 28], "custom": 17, "symmetr": 17, "enclos": 17, "perimet": 17, "mean": [17, 19, 20], "arrai": [17, 19, 20, 21, 25, 27, 28], "pad": 17, "achiev": 17, "alter": 17, "elimin": 17, "appropri": [17, 24, 25], "ad": [17, 27, 28, 29], "np": [17, 19], "coord_si": [17, 18, 19, 21, 25, 27], "either": [17, 21, 24, 27], "global": [17, 19, 24], "model": [17, 24], "assum": 17, "perfect": 17, "build": [17, 19, 23, 24], "num_peri_dim": [17, 18, 19, 21], "periodic_dim": [17, 18, 19, 21], "identifi": [17, 25], "consid": [17, 28], "must": [17, 19, 20, 23, 25, 27], "alwai": [17, 26, 27, 28], "non": 17, "pole_dim": [17, 18, 19, 21], "help": 17, "smooth": 17, "polar": 17, "mark": 17, "affect": [17, 23], "those": [17, 20, 21, 25, 27, 28], "assign": [17, 21], "defin": [17, 21, 27], "activ": 17, "discuss": 17, "cover": 17, "import": [17, 19, 22], "add_item": [17, 18, 19, 21], "dtype": [17, 19, 28], "Then": 17, "get_area": [17, 18, 19, 20], "function": [17, 22, 24, 28, 29], "unit": [17, 23], "ha": [17, 19, 21, 23, 24, 26], "been": [17, 19, 21, 23], "get_item": [17, 18, 21], "gridlon": [17, 19], "gridlat": [17, 19], "gridloncorn": 17, "gridlatcorn": 17, "lon": [17, 19, 21, 25, 27], "linspac": 17, "120": 17, "lat": [17, 19, 21, 25, 27], "67": 17, "lon_corn": [17, 19], "arang": [17, 19], "180": [17, 19], "lat_corn": [17, 19], "90": [17, 19], "lonm": [17, 19], "latm": [17, 19], "meshgrid": [17, 19], "ij": [17, 19], "lonm_corn": 17, "latm_corn": 17, "32224085": 17, "02707409": 17, "known": [17, 24, 27], "vertex": [17, 20, 27], "small": [17, 23, 27], "term": [17, 27], "boundari": [17, 27], "thought": [17, 25], "compos": [17, 27], "tetrahedra": 17, "squar": [17, 24, 27], "were": 17, "whose": 17, "equal": [17, 21], "manifold": [17, 27], "behav": 17, "tetrahedron": 17, "hexahedron": 17, "particular": [17, 25], "mix": [17, 25], "cannot": [17, 23, 27], "To": [17, 23, 25], "we": [17, 23], "properti": [17, 20, 21, 25, 26, 27], "whole": 17, "hand": 17, "distribut": [17, 20], "strategi": 17, "present": 17, "associ": [17, 20, 21, 25, 27, 28, 29], "without": [17, 19, 20, 23, 28], "home": [17, 24], "sinc": 17, "duplic": 17, "manner": [17, 19, 20, 21, 25, 27, 28, 29], "own": [17, 27], "ownership": 17, "smaller": [17, 27], "id": [17, 19, 26, 27], "node_id": [17, 27], "node_coord": [17, 27], "node_own": [17, 27], "uniqu": 17, "attach": [17, 28], "togeth": 17, "piec": [17, 19], "owner": 17, "charg": 17, "element_id": [17, 27], "element_typ": [17, 27], "element_conn": [17, 27], "choic": 17, "restrict": 17, "hexagon": 17, "impli": 17, "note": [17, 19, 20, 23, 24, 27, 28], "NOT": [17, 21, 27], "local": [17, 21], "info": 17, "isn": 17, "counterclockwis": [17, 27], "step": [17, 21, 27], "constructor": [17, 27], "add_nod": [17, 18, 19, 27], "add_el": [17, 18, 19, 27], "8": [17, 19, 23, 28], "11": [17, 19], "9": [17, 19], "parametric_dim": [17, 19, 27], "spatial_dim": [17, 19, 27], "num_nod": [17, 19], "num_elem": [17, 19], "nodeid": [17, 19], "nodecoord": [17, 19], "nodeown": [17, 19], "elemid": [17, 19], "elemtyp": [17, 19], "elemconn": [17, 19], "elem": 17, "similar": 17, "vari": 17, "slightli": [17, 19], "node_mask": [17, 27], "src_mask_valu": [17, 19, 28], "dst_mask_valu": [17, 19, 28], "element_mask": [17, 27], "element_area": [17, 27], "assimil": [17, 25], "world": [17, 22, 25], "store": [17, 20, 21, 25, 28], "kei": [17, 25, 28], "essenti": 17, "descriptor": [17, 25], "referenc": [17, 20, 21, 25, 27], "while": [17, 24, 28], "chosen": 17, "maintain": 17, "veri": [17, 23], "larg": 17, "might": 17, "effici": 17, "critic": 17, "irregularli": 17, "fact": 17, "relationship": [17, 20], "16": [17, 19, 21], "deg_rad": [17, 19], "pi": [17, 19], "25": [17, 19], "domask": [17, 19], "packag": [17, 18, 22, 24], "capabl": [17, 23, 24, 26], "found": [17, 23, 24, 28], "compat": 17, "convers": 17, "extens": 17, "climat": [17, 24], "forecast": [17, 24], "metadata": [17, 20, 27], "earth": [17, 24], "therefor": [17, 21], "convert_to_du": [17, 27], "properli": [17, 26], "boolean": [17, 19, 21, 26, 27], "whether": [17, 19, 21, 26, 27], "add": [17, 19, 21, 27], "add_user_area": [17, 21, 27], "add_mask": [17, 21], "held": 17, "varnam": [17, 21, 27], "unmask": 17, "is_spher": [17, 21], "add_corner_stagg": [17, 19, 21], "read": [17, 18, 20, 21, 22, 23, 24, 28, 29], "them": [17, 19, 23], "coord_nam": [17, 21], "grid_imask": 17, "particip": 17, "short": 17, "behavior": 17, "potenti": 17, "solut": [17, 19], "necessarili": 17, "could": [17, 19], "signific": 17, "avoid": 17, "over": [17, 21, 28], "ocean": 17, "basin": 17, "run": [17, 22, 23, 26], "half": 17, "wai": [17, 21, 27], "shorter": 17, "exact": 17, "opposit": 17, "antipod": 17, "problem": [17, 23, 24], "break": 17, "insert": 17, "extra": [17, 19, 20], "target": [17, 23], "resolv": 17, "ambigu": 17, "direct": 17, "wherebi": 17, "certain": 17, "unus": 17, "land": [17, 24], "upon": [17, 20], "pass": 17, "high": 17, "similarli": 17, "zero_region": [17, 19, 28, 29], "uniniti": 17, "among": 17, "thing": 17, "come": 17, "fanci": 17, "dimension": [17, 19, 24], "effort": 17, "put": 17, "inappropri": 17, "attempt": [17, 23], "rememb": [17, 28], "propag": 17, "down": [17, 24], "lower": [17, 19, 20, 21, 25], "fortran": [17, 19, 20, 21, 25, 27], "c": [17, 23, 28], "engin": [17, 24], "updat": 17, "made": 17, "feel": 17, "natur": 17, "translat": 17, "continu": 17, "likewis": 17, "befor": [17, 27, 28, 29], "tempor": 17, "coord": [17, 18, 21, 27], "22": [17, 19], "ndbound": [17, 18, 19, 20], "time": [17, 20, 23, 26, 27], "thin": 17, "wrapper": [17, 20, 21, 25, 27], "wa": [17, 23, 28], "design": [17, 24, 26], "perform": [17, 21], "scalabl": [17, 24], "layer": 17, "transpar": 17, "littl": 17, "special": 17, "access": [17, 18, 24], "mpi4pi": [17, 19, 23], "necessari": [17, 19, 23], "post": 17, "task": 17, "few": [17, 23], "desir": [17, 19, 20, 23], "core": [17, 26], "probabl": [17, 19], "easiest": 17, "job": 17, "serial": [17, 22, 23], "script": [17, 19], "mpich": [17, 19], "openmpi": [17, 19, 23], "seen": 17, "success": 17, "third": 17, "highli": 17, "recommend": [17, 23], "demonstr": [17, 19], "directori": [17, 23], "well": 17, "hello_world": 17, "py": 17, "sy": [17, 19], "parent": [17, 19], "len": [17, 19], "argv": [17, 19], "worker": [17, 19], "comm": [17, 19], "comm_world": [17, 19], "arg": [17, 19], "maxproc": [17, 19], "shutdown": [17, 19], "elif": [17, 19], "try": [17, 19, 23], "get_par": [17, 19], "rank": [17, 18, 19, 20, 21, 25, 26, 27], "get_rank": [17, 19], "valueerror": [17, 19], "usag": [17, 19], "etc": [17, 20, 21, 23], "print": [17, 19], "hello": [17, 22], "str": [17, 20, 21, 25, 27], "catch": [17, 19], "els": [17, 19], "tutori": [17, 22], "document": [17, 19, 23, 28], "manag": [18, 19, 22, 23, 28, 29], "moab": [18, 22, 26], "barrier": [18, 19, 26], "lower_bound": [18, 19, 20, 21, 25], "upper_bound": [18, 19, 20, 21, 25], "xd": [18, 20], "copi": [18, 20, 21, 25, 26, 27, 28, 29], "areatyp": [18, 21], "has_corn": [18, 21], "max_index": [18, 19, 21], "add_coord": [18, 19, 21], "size_own": [18, 27], "free_memori": [18, 27], "locstream": [18, 20, 22, 24, 28, 29], "__call__": [18, 28, 29], "get_factor": [18, 28], "get_weights_dict": [18, 28], "remap": [18, 24], "http": 18, "oceans11": 18, "lanl": 18, "gov": 18, "trac": 18, "last": [18, 20, 24], "dec": 18, "2015": 18, "lo": 18, "alamo": 18, "softwar": [18, 24], "releas": [18, 20, 21, 23, 24, 25, 27, 28, 29], "lacc": 18, "98": 18, "45": 18, "processor": [19, 23, 27], "snippet": 19, "def": 19, "create_locstream_spherical_16": 19, "fals": [19, 21, 26, 27, 28], "param": [19, 20], "create_locstream_spherical_16_parallel": 19, "grid_create_from_coordin": 19, "xcoord": 19, "ycoord": 19, "xcorner": 19, "ycorner": 19, "doarea": 19, "ctk": 19, "coordiant": 19, "1st": 19, "2nd": 19, "arbitrari": 19, "alloc": [19, 20, 21, 22, 27], "coord_typekind": [19, 21], "gridxcent": 19, "x_par": 19, "reshap": 19, "gridycent": 19, "y_par": 19, "lbx": 19, "ubx": 19, "lby": 19, "ubi": 19, "gridxcorn": 19, "i0": 19, "gridycorn": 19, "i1": 19, "75": 19, "grid_create_from_coordinates_3d": 19, "zcoord": 19, "zcorner": 19, "xcoordin": 19, "ycoordin": 19, "zcoordin": 19, "3rd": 19, "gridzcent": 19, "z_par": 19, "lbz": 19, "ubz": 19, "gridzcorn": 19, "i2": 19, "grid_create_from_coordinates_period": 19, "lon_par": 19, "lat_par": 19, "mesh_create_5": 19, "precondit": 19, "postcondit": 19, "31": 19, "32": 19, "33": 19, "21": 19, "23": 19, "13": 19, "spatial": [19, 22, 27], "elemcoord": 19, "element_coord": [19, 27], "create_field": 19, "gml": 19, "string": [19, 27, 28, 29], "initialize_field_grid_period": 19, "deg2rad": 19, "141592653589793": 19, "pointer": 19, "gridxcoord": 19, "gridycoord": 19, "co": 19, "run_regrid": 19, "srcfield": [19, 28, 29], "dstfield": [19, 28, 29], "srcfracfield": 19, "dstfracfield": 19, "modifi": 19, "dstfractfield": 19, "regridsrc2dst": 19, "regrid_method": [19, 28], "unmapped_act": [19, 28], "src_frac_field": [19, 28], "dst_frac_field": [19, 28], "compute_mass_grid": 19, "valuefield": 19, "dofrac": 19, "fracfield": 19, "uninitv": 19, "422397696": 19, "give": [19, 24], "float": [19, 21, 27, 28], "areafield": 19, "ind": 19, "stand": 19, "alon": 19, "modif": 19, "o": 19, "cache_data": 19, "data_dir": 19, "datamiss": 19, "repositori": [19, 23], "uncom": 19, "block": [19, 21, 26], "cache_data_fil": 19, "join": 19, "so_omon_giss": 19, "e2": 19, "nc": 19, "mpas_uniform_10242_dual_counterclockwis": 19, "datafil": 19, "exist": [19, 20, 23], "download": [19, 23, 24], "meshfil": 19, "filenam": [19, 20, 21, 27, 28, 29], "filetyp": [19, 21, 27], "timeslic": [19, 20], "clockwis": 19, "remov": 19, "1e20": 19, "successfulli": [19, 23], "style": 19, "novemb": 19, "2017": 19, "memori": [19, 20, 21, 22, 23, 25, 27, 28, 29], "350": 19, "85": 19, "srcgrid": 19, "srcgridcoordlon": 19, "srcgridcoordlat": 19, "slons_par": 19, "slats_par": 19, "sure": 19, "index": [19, 20, 21, 22, 28], "backend": [19, 22, 26], "dest": 19, "357": 19, "87": 19, "dstgrid": 19, "dstgridcoordlat": 19, "dstgridcoordlon": 19, "dlons_par": 19, "dlats_par": 19, "xctfield": 19, "wave": 19, "lambda": 19, "sin": 19, "outer": 19, "esmpy_example_weight_fil": 19, "isfil": 19, "getcwd": 19, "rel": [19, 23], "prod": 19, "relerr": 19, "meanrelerr": 19, "ab": 19, "reduce_v": 19, "op": [19, 26], "reduc": [19, 28], "matplotlib": 19, "pyplot": 19, "plt": 19, "fig": 19, "figur": 19, "15": 19, "suptitl": 19, "fontsiz": 19, "14": 19, "fontweight": 19, "bold": 19, "ax": 19, "add_subplot": 19, "im": 19, "imshow": 19, "vmin": 19, "vmax": 19, "cmap": 19, "gist_ncar": 19, "aspect": [19, 23], "auto": 19, "extent": 19, "min": 19, "max": 19, "set_xbound": 19, "upper": [19, 20, 21, 25], "set_ybound": 19, "set_xlabel": 19, "set_ylabel": 19, "set_titl": 19, "subplots_adjust": 19, "right": 19, "cbar_ax": 19, "add_ax": 19, "01": 19, "colorbar": 19, "cax": 19, "show": 19, "ll1deg_grid": 19, "grid1": 19, "locstream_util": 19, "14159": 19, "ravel": 19, "assert": 19, "5e": 19, "mesh_util": 19, "mesh_create_5_parallel": 19, "create_locstream_16": 19, "create_locstream_16_parallel": 19, "_": 19, "todo": 19, "seem": 19, "fail": 19, "occasion": 19, "due": [19, 25], "toler": 19, "ask": 19, "bob": 19, "3e": 19, "mask_valu": 19, "mul": 19, "4e": 19, "subprocess": 19, "instal": [19, 22], "juli": 19, "2016": 19, "importerror": 19, "grid2": 19, "uniform": 19, "latlon": 19, "compute_error": 19, "start_work": 19, "execut": [19, 22, 26], "gather": 19, "root": 19, "concaten": [19, 27], "plot": 19, "send": 19, "sendobj": 19, "temperatur": 20, "discret": [20, 21, 22], "nw": 20, "share": [20, 23], "replic": 20, "friendli": [20, 28], "tupl": [20, 27, 28], "ndarrai": [20, 27, 28], "int": [20, 21, 25, 26, 27, 28], "ungrid": 20, "safe": [20, 21, 25, 27, 28, 29], "shallow": [20, 21, 25, 27, 28, 29], "compliant": [20, 21, 27], "esmf_comm": 20, "mpiuni": 20, "pole_kind": 21, "reg_decomp": 21, "decompflag": 21, "tiles": 21, "regdecompptil": 21, "decomposit": 21, "resourc": [21, 22], "frequent": 21, "outlin": [21, 27], "length": 21, "period": [21, 22], "minimum": [21, 23], "maximum": 21, "bool": [21, 25, 26, 27, 28], "otherwis": [21, 23], "gener": [21, 24, 25, 28], "missing_valu": 21, "attribut": 21, "miss": 21, "even": 21, "4d": 21, "cube": [21, 23, 27], "de": 21, "decount": 21, "product": 21, "By": [21, 23], "decompos": 21, "sequenti": 21, "greater": [21, 23], "instanc": 21, "1x2": 21, "remain": 21, "from_fil": 21, "directli": [21, 27], "alias": [21, 27], "welcom": 22, "overview": 22, "anaconda": 22, "limit": 22, "helper": 22, "parallel": [22, 23, 24], "analyt": 22, "mass": [22, 28], "mpi": [22, 23], "spawn": 22, "driver": 22, "slice": 22, "mpirun": 22, "v": 22, "appendic": 22, "search": 22, "succe": 23, "pio": 23, "io": 23, "bind": 23, "pytest": 23, "test": 23, "git": 23, "guid": 23, "architectur": 23, "conda": 23, "forg": 23, "channel": 23, "develop": 23, "esmpy_dev": 23, "pip": 23, "command": [23, 24], "src": 23, "addon": 23, "python3": 23, "m": [23, 28], "pleas": [23, 24, 28, 29], "contact": [23, 24], "esmf_support": [23, 24], "ucar": [23, 24], "edu": [23, 24], "question": [23, 24], "With": 23, "automat": 23, "setuptool": 23, "think": 23, "you": 23, "caus": 23, "solv": 23, "simpli": 23, "rerun": 23, "see": [23, 24, 26, 28, 29], "reason": 23, "extern": 23, "esmfmkfil": 23, "guess": 23, "correctli": 23, "nonetheless": 23, "chang": [23, 24], "v8": 23, "older": 23, "previou": 23, "wider": 23, "coverag": 23, "test_unit": 23, "test_exampl": 23, "test_unit_parallel": 23, "test_examples_parallel": 23, "test_regrid_from_fil": 23, "regrid_from_fil": 23, "lot": 23, "bandwidth": 23, "download_regrid_from_fil": 23, "download_exampl": 23, "actual": 23, "stress": 23, "subdirectori": 23, "esmpy_data_dir": 23, "popul": 23, "pre": 23, "esmpy_data_new_dir": 23, "doesn": 23, "bundl": 23, "offlin": 23, "lapack": 23, "abil": 23, "fieldbundl": 23, "relat": [23, 24], "nightli": 23, "regress": 23, "subset": 23, "platform": [23, 24], "darwin": 23, "linux": 23, "gfortran": 23, "coupl": 24, "weather": 24, "robust": 24, "wide": 24, "unconnect": 24, "stream": [24, 25], "outsid": 24, "fulli": 24, "underneath": 24, "qualiti": 24, "transform": 24, "commun": [24, 26], "atmospher": 24, "analysi": 24, "visual": 24, "broken": 24, "stage": 24, "separ": 24, "suitabl": 24, "variant": 24, "algorithm": 24, "vice": 24, "versa": 24, "categor": 24, "proport": 24, "simpl": 24, "latest": 24, "bug": 24, "webpag": 24, "nice": 24, "esmf_regridweightgen": 24, "regid": 24, "thorough": 24, "location_count": 25, "dictionari": [25, 28], "Their": 25, "height": 25, "regular": 25, "concept": 25, "locstrea": 25, "syntax": 25, "recogn": 25, "esmpymanag": 26, "endflag": 26, "endact": 26, "singleton": 26, "ensur": 26, "__del__": 26, "regist": 26, "atexit": 26, "exit": 26, "alia": 26, "explicitli": 26, "runtim": 26, "esmp_initi": 26, "subsequ": 26, "esmp_fin": 26, "__init__": 26, "test_exhaust": 26, "member": 26, "combinatori": 26, "expans": 26, "logfil": 26, "docstr": 26, "meshnam": 27, "mask_flag": 27, "regrididng": 27, "dual": 27, "enumer": 27, "element_count": 27, "node_count": 27, "free": 27, "longer": 27, "ongo": 27, "rh_filenam": [28, 29], "pole_method": 28, "regrid_pole_npoint": 28, "line_typ": 28, "norm_typ": 28, "extrap_method": 28, "extrap_num_src_pnt": 28, "extrap_dist_expon": 28, "ignore_degener": 28, "create_rh": 28, "src_file": 28, "dst_file": 28, "src_file_typ": 28, "dst_file_typ": 28, "factor": 28, "large_fil": 28, "analog": [28, 29], "esmf_fieldregridstor": 28, "esmf_fieldregrid": [28, 29], "esmf_fieldregridreleas": [28, 29], "overwritten": [28, 29], "expon": 28, "distant": 28, "degener": 28, "check": 28, "proce": 28, "skip": 28, "convert": 28, "64": 28, "bit": 28, "offset": 28, "2gb": 28, "earlier": 28, "deep_copi": 28, "though": 28, "factors_index": 28, "tupe": 28, "col": 28, "contigu": 28, "accord": 28, "collector": 28, "numer": 28, "tight": 28, "loop": 28, "leak": 28, "deep": 28, "row_dst": 28, "col_src": 28, "dict": 28, "esmf_fieldsmmstor": 29}, "objects": {"": [[24, 0, 0, "-", "esmpy"]], "esmpy.api.constants": [[0, 1, 1, "", "CoordSys"], [1, 1, 1, "", "ExtrapMethod"], [2, 1, 1, "", "FileFormat"], [3, 1, 1, "", "FileMode"], [4, 1, 1, "", "GridItem"], [5, 1, 1, "", "LineType"], [6, 1, 1, "", "LogKind"], [7, 1, 1, "", "MeshElemType"], [8, 1, 1, "", "MeshLoc"], [9, 1, 1, "", "NormType"], [10, 1, 1, "", "PoleKind"], [11, 1, 1, "", "PoleMethod"], [12, 1, 1, "", "Region"], [13, 1, 1, "", "RegridMethod"], [14, 1, 1, "", "StaggerLoc"], [15, 1, 1, "", "TypeKind"], [16, 1, 1, "", "UnmappedAction"]], "esmpy.api.constants.CoordSys": [[0, 2, 1, "", "CART"], [0, 2, 1, "", "SPH_DEG"], [0, 2, 1, "", "SPH_RAD"]], "esmpy.api.constants.ExtrapMethod": [[1, 2, 1, "", "CREEP_FILL"], [1, 2, 1, "", "NEAREST_IDAVG"], [1, 2, 1, "", "NEAREST_STOD"], [1, 2, 1, "", "NONE"]], "esmpy.api.constants.FileFormat": [[2, 2, 1, "", "ESMFGRID"], [2, 2, 1, "", "ESMFMESH"], [2, 2, 1, "", "GRIDSPEC"], [2, 2, 1, "", "SCRIP"], [2, 2, 1, "", "UGRID"], [2, 2, 1, "", "VTK"]], "esmpy.api.constants.FileMode": [[3, 2, 1, "", "BASIC"], [3, 2, 1, "", "WITHAUX"]], "esmpy.api.constants.GridItem": [[4, 2, 1, "", "AREA"], [4, 2, 1, "", "MASK"]], "esmpy.api.constants.LineType": [[5, 2, 1, "", "CART"], [5, 2, 1, "", "GREAT_CIRCLE"]], "esmpy.api.constants.LogKind": [[6, 2, 1, "", "MULTI"], [6, 2, 1, "", "NONE"]], "esmpy.api.constants.MeshElemType": [[7, 2, 1, "", "HEX"], [7, 2, 1, "", "QUAD"], [7, 2, 1, "", "TETRA"], [7, 2, 1, "", "TRI"]], "esmpy.api.constants.MeshLoc": [[8, 2, 1, "", "ELEMENT"], [8, 2, 1, "", "NODE"]], "esmpy.api.constants.NormType": [[9, 2, 1, "", "DSTAREA"], [9, 2, 1, "", "FRACAREA"]], "esmpy.api.constants.PoleKind": [[10, 2, 1, "", "BIPOLE"], [10, 2, 1, "", "MONOPOLE"], [10, 2, 1, "", "NONE"]], "esmpy.api.constants.PoleMethod": [[11, 2, 1, "", "ALLAVG"], [11, 2, 1, "", "NONE"], [11, 2, 1, "", "NPNTAVG"], [11, 2, 1, "", "TEETH"]], "esmpy.api.constants.Region": [[12, 2, 1, "", "EMPTY"], [12, 2, 1, "", "SELECT"], [12, 2, 1, "", "TOTAL"]], "esmpy.api.constants.RegridMethod": [[13, 2, 1, "", "BILINEAR"], [13, 2, 1, "", "CONSERVE"], [13, 2, 1, "", "CONSERVE_2ND"], [13, 2, 1, "", "NEAREST_DTOS"], [13, 2, 1, "", "NEAREST_STOD"], [13, 2, 1, "", "PATCH"]], "esmpy.api.constants.StaggerLoc": [[14, 2, 1, "", "CENTER"], [14, 2, 1, "", "CENTER_VCENTER"], [14, 2, 1, "", "CENTER_VFACE"], [14, 2, 1, "", "CORNER"], [14, 2, 1, "", "CORNER_VCENTER"], [14, 2, 1, "", "CORNER_VFACE"], [14, 2, 1, "", "EDGE1"], [14, 2, 1, "", "EDGE1_VCENTER"], [14, 2, 1, "", "EDGE1_VFACE"], [14, 2, 1, "", "EDGE2"], [14, 2, 1, "", "EDGE2_VCENTER"], [14, 2, 1, "", "EDGE2_VFACE"]], "esmpy.api.constants.TypeKind": [[15, 2, 1, "", "I4"], [15, 2, 1, "", "I8"], [15, 2, 1, "", "R4"], [15, 2, 1, "", "R8"]], "esmpy.api.constants.UnmappedAction": [[16, 2, 1, "", "ERROR"], [16, 2, 1, "", "IGNORE"]], "esmpy.api.esmpymanager": [[26, 1, 1, "", "Manager"]], "esmpy.api.esmpymanager.Manager": [[26, 3, 1, "", "barrier"], [26, 4, 1, "", "local_pet"], [26, 4, 1, "", "moab"], [26, 4, 1, "", "pet_count"], [26, 3, 1, "", "set_moab"]], "esmpy.api.field": [[20, 1, 1, "", "Field"]], "esmpy.api.field.Field": [[20, 3, 1, "", "copy"], [20, 4, 1, "", "data"], [20, 3, 1, "", "destroy"], [20, 3, 1, "", "get_area"], [20, 4, 1, "", "grid"], [20, 4, 1, "", "lower_bounds"], [20, 4, 1, "", "name"], [20, 4, 1, "", "ndbounds"], [20, 4, 1, "", "rank"], [20, 3, 1, "", "read"], [20, 4, 1, "", "staggerloc"], [20, 4, 1, "", "type"], [20, 4, 1, "", "upper_bounds"], [20, 4, 1, "", "xd"]], "esmpy.api.grid": [[21, 1, 1, "", "Grid"]], "esmpy.api.grid.Grid": [[21, 3, 1, "", "add_coords"], [21, 3, 1, "", "add_item"], [21, 4, 1, "", "area"], [21, 4, 1, "", "areatype"], [21, 4, 1, "", "coord_sys"], [21, 4, 1, "", "coords"], [21, 3, 1, "", "copy"], [21, 3, 1, "", "destroy"], [21, 3, 1, "", "get_coords"], [21, 3, 1, "", "get_item"], [21, 4, 1, "", "has_corners"], [21, 4, 1, "", "lower_bounds"], [21, 4, 1, "", "mask"], [21, 4, 1, "", "max_index"], [21, 4, 1, "", "num_peri_dims"], [21, 4, 1, "", "periodic_dim"], [21, 4, 1, "", "pole_dim"], [21, 4, 1, "", "rank"], [21, 4, 1, "", "size"], [21, 4, 1, "", "staggerloc"], [21, 4, 1, "", "type"], [21, 4, 1, "", "upper_bounds"]], "esmpy.api.locstream": [[25, 1, 1, "", "LocStream"]], "esmpy.api.locstream.LocStream": [[25, 3, 1, "", "copy"], [25, 3, 1, "", "destroy"], [25, 4, 1, "", "lower_bounds"], [25, 4, 1, "", "name"], [25, 4, 1, "", "rank"], [25, 4, 1, "", "size"], [25, 4, 1, "", "upper_bounds"]], "esmpy.api.mesh": [[27, 1, 1, "", "Mesh"]], "esmpy.api.mesh.Mesh": [[27, 3, 1, "", "add_elements"], [27, 3, 1, "", "add_nodes"], [27, 4, 1, "", "area"], [27, 4, 1, "", "coord_sys"], [27, 4, 1, "", "coords"], [27, 3, 1, "", "copy"], [27, 3, 1, "", "destroy"], [27, 3, 1, "", "free_memory"], [27, 3, 1, "", "get_coords"], [27, 4, 1, "", "mask"], [27, 4, 1, "", "rank"], [27, 4, 1, "", "size"], [27, 4, 1, "", "size_owned"]], "esmpy.api.regrid": [[28, 1, 1, "", "Regrid"], [29, 1, 1, "", "RegridFromFile"]], "esmpy.api.regrid.Regrid": [[28, 3, 1, "", "__call__"], [28, 3, 1, "", "copy"], [28, 3, 1, "", "destroy"], [28, 3, 1, "", "get_factors"], [28, 3, 1, "", "get_weights_dict"]], "esmpy.api.regrid.RegridFromFile": [[29, 3, 1, "", "__call__"], [29, 3, 1, "", "copy"], [29, 3, 1, "", "destroy"]]}, "objtypes": {"0": "py:module", "1": "py:class", "2": "py:attribute", "3": "py:method", "4": "py:property"}, "objnames": {"0": ["py", "module", "Python module"], "1": ["py", "class", "Python class"], "2": ["py", "attribute", "Python attribute"], "3": ["py", "method", "Python method"], "4": ["py", "property", "Python property"]}, "titleterms": {"coordsi": 0, "extrapmethod": 1, "fileformat": 2, "filemod": 3, "griditem": 4, "linetyp": 5, "logkind": 6, "meshelemtyp": 7, "meshloc": 8, "normtyp": 9, "polekind": 10, "polemethod": 11, "region": 12, "regridmethod": 13, "staggerloc": 14, "typekind": 15, "unmappedact": 16, "api": [17, 18], "class": [17, 18], "name": [17, 18], "constant": [17, 18], "manag": [17, 26], "resourc": 17, "alloc": 17, "log": 17, "memori": 17, "moab": 17, "mesh": [17, 19, 27], "backend": 17, "spatial": 17, "discret": 17, "object": 17, "grid": [17, 19, 21], "stagger": 17, "spheric": 17, "coordin": 17, "period": [17, 19], "pole": 17, "gener": 17, "mask": 17, "cell": 17, "area": 17, "creation": 17, "locstream": [17, 19, 25], "creat": [17, 19], "from": [17, 19, 23], "file": [17, 19], "format": 17, "scrip": 17, "esmfmesh": 17, "gridspec": 17, "ugrid": 17, "regrid": [17, 19, 28], "great": 17, "circl": 17, "numpi": 17, "slice": 17, "index": 17, "dimens": 17, "order": 17, "parallel": [17, 19], "execut": 17, "mpirun": 17, "v": 17, "mpi": [17, 19], "spawn": [17, 19], "appendic": 18, "refer": 18, "tutori": 19, "hello": 19, "world": 19, "helper": 19, "function": 19, "2d": 19, "3d": 19, "5": 19, "element": 19, "field": [19, 20], "initi": 19, "an": 19, "analyt": 19, "run": 19, "esmpi": [19, 23], "comput": 19, "mass": 19, "read": 19, "write": 19, "weight": 19, "us": 19, "serial": 19, "python": 19, "driver": 19, "tabl": 22, "content": 22, "instal": 23, "requir": 23, "get": 23, "code": 23, "anaconda": 23, "packag": 23, "sourc": 23, "import": [23, 24], "valid": 23, "limit": 23, "overview": 24, "link": 24, "regridfromfil": 29}, "envversion": {"sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.intersphinx": 1, "sphinxcontrib.bibtex": 9, "sphinx": 58}, "alltitles": {"CoordSys": [[0, "coordsys"]], "ExtrapMethod": [[1, "extrapmethod"]], "FileFormat": [[2, "fileformat"]], "FileMode": [[3, "filemode"]], "GridItem": [[4, "griditem"]], "LineType": [[5, "linetype"]], "LogKind": [[6, "logkind"]], "MeshElemType": [[7, "meshelemtype"]], "MeshLoc": [[8, "meshloc"]], "NormType": [[9, "normtype"]], "PoleKind": [[10, "polekind"]], "PoleMethod": [[11, "polemethod"]], "Region": [[12, "region"]], "RegridMethod": [[13, "regridmethod"]], "StaggerLoc": [[14, "staggerloc"]], "TypeKind": [[15, "typekind"]], "UnmappedAction": [[16, "unmappedaction"]], "API": [[17, "api"]], "Classes": [[17, "classes"]], "Named Constants": [[17, "named-constants"], [18, "named-constants"]], "Manager": [[17, "manager"], [26, "manager"]], "Resource Allocation": [[17, "resource-allocation"]], "Logging": [[17, "logging"]], "Memory management": [[17, "memory-management"]], "MOAB Mesh backend": [[17, "moab-mesh-backend"]], "Spatial Discretization Objects": [[17, "spatial-discretization-objects"]], "Grid": [[17, "grid"], [21, "grid"]], "Staggering": [[17, "staggering"]], "Spherical Coordinates": [[17, "spherical-coordinates"]], "Periodicity": [[17, "periodicity"]], "Pole Generation": [[17, "pole-generation"]], "Masking": [[17, "masking"], [17, "id3"], [17, "id15"]], "Cell Areas": [[17, "cell-areas"]], "Mesh": [[17, "mesh"], [27, "mesh"]], "Mesh Creation": [[17, "mesh-creation"]], "Areas": [[17, "areas"]], "LocStream": [[17, "locstream"], [25, "locstream"]], "Create a Grid or Mesh from File": [[17, "create-a-grid-or-mesh-from-file"]], "File Formats": [[17, "file-formats"]], "SCRIP": [[17, "scrip"]], "ESMFMESH": [[17, "esmfmesh"]], "GRIDSPEC": [[17, "gridspec"]], "UGRID": [[17, "ugrid"]], "Meshes from File": [[17, "meshes-from-file"]], "Grids from File": [[17, "grids-from-file"]], "Regridding": [[17, "regridding"], [19, "regridding"]], "Great Circle Cells": [[17, "great-circle-cells"]], "Numpy Slicing and Indexing": [[17, "numpy-slicing-and-indexing"]], "Dimension Ordering": [[17, "dimension-ordering"]], "Parallel Execution": [[17, "parallel-execution"]], "mpirun vs. MPI.Spawn": [[17, "mpirun-vs-mpi-spawn"]], "mpirun": [[17, "mpirun"]], "MPI.Spawn": [[17, "mpi-spawn"]], "Appendices": [[18, "appendices"]], "Class APIs": [[18, "class-apis"]], "References": [[18, "references"]], "Tutorials": [[19, "tutorials"]], "Hello World": [[19, "hello-world"]], "Regridding Helper Functions": [[19, "regridding-helper-functions"]], "LocStream Create": [[19, "locstream-create"]], "LocStream Create Parallel": [[19, "locstream-create-parallel"]], "Create a 2D Grid": [[19, "create-a-2d-grid"]], "Create a 3D Grid": [[19, "create-a-3d-grid"]], "Create a Periodic Grid": [[19, "create-a-periodic-grid"]], "Create a 5 Element Mesh": [[19, "create-a-5-element-mesh"]], "Create a Field": [[19, "create-a-field"]], "Initialize an Analytic Field": [[19, "initialize-an-analytic-field"]], "Run ESMPy Regridding": [[19, "run-esmpy-regridding"]], "Compute Field Mass": [[19, "compute-field-mass"]], "Grid, Mesh and Field Created from File": [[19, "grid-mesh-and-field-created-from-file"]], "Read and Write a Weight File": [[19, "read-and-write-a-weight-file"]], "Grid to LocStream": [[19, "grid-to-locstream"]], "Mesh to LocStream": [[19, "mesh-to-locstream"]], "LocStream to Grid": [[19, "locstream-to-grid"]], "Using MPI.Spawn() from a Serial Python Driver": [[19, "using-mpi-spawn-from-a-serial-python-driver"]], "Field": [[20, "field"]], "Table of Contents": [[22, "table-of-contents"]], "Installation": [[23, "installation"]], "Requirements": [[23, "requirements"]], "Getting the code": [[23, "getting-the-code"]], "Anaconda Packages": [[23, "anaconda-packages"]], "Installing ESMPy from Source": [[23, "installing-esmpy-from-source"]], "Importing ESMPy": [[23, "importing-esmpy"]], "Validation": [[23, "validation"]], "Limitations": [[23, "limitations"]], "Overview": [[24, "module-esmpy"]], "Important Links": [[24, "important-links"]], "Regrid": [[28, "regrid"]], "RegridFromFile": [[29, "regridfromfile"]]}, "indexentries": {"cart (esmpy.api.constants.coordsys attribute)": [[0, "esmpy.api.constants.CoordSys.CART"]], "coordsys (class in esmpy.api.constants)": [[0, "esmpy.api.constants.CoordSys"]], "sph_deg (esmpy.api.constants.coordsys attribute)": [[0, "esmpy.api.constants.CoordSys.SPH_DEG"]], "sph_rad (esmpy.api.constants.coordsys attribute)": [[0, "esmpy.api.constants.CoordSys.SPH_RAD"]], "creep_fill (esmpy.api.constants.extrapmethod attribute)": [[1, "esmpy.api.constants.ExtrapMethod.CREEP_FILL"]], "extrapmethod (class in esmpy.api.constants)": [[1, "esmpy.api.constants.ExtrapMethod"]], "nearest_idavg (esmpy.api.constants.extrapmethod attribute)": [[1, "esmpy.api.constants.ExtrapMethod.NEAREST_IDAVG"]], "nearest_stod (esmpy.api.constants.extrapmethod attribute)": [[1, "esmpy.api.constants.ExtrapMethod.NEAREST_STOD"]], "none (esmpy.api.constants.extrapmethod attribute)": [[1, "esmpy.api.constants.ExtrapMethod.NONE"]], "esmfgrid (esmpy.api.constants.fileformat attribute)": [[2, "esmpy.api.constants.FileFormat.ESMFGRID"]], "esmfmesh (esmpy.api.constants.fileformat attribute)": [[2, "esmpy.api.constants.FileFormat.ESMFMESH"]], "fileformat (class in esmpy.api.constants)": [[2, "esmpy.api.constants.FileFormat"]], "gridspec (esmpy.api.constants.fileformat attribute)": [[2, "esmpy.api.constants.FileFormat.GRIDSPEC"]], "scrip (esmpy.api.constants.fileformat attribute)": [[2, "esmpy.api.constants.FileFormat.SCRIP"]], "ugrid (esmpy.api.constants.fileformat attribute)": [[2, "esmpy.api.constants.FileFormat.UGRID"]], "vtk (esmpy.api.constants.fileformat attribute)": [[2, "esmpy.api.constants.FileFormat.VTK"]], "basic (esmpy.api.constants.filemode attribute)": [[3, "esmpy.api.constants.FileMode.BASIC"]], "filemode (class in esmpy.api.constants)": [[3, "esmpy.api.constants.FileMode"]], "withaux (esmpy.api.constants.filemode attribute)": [[3, "esmpy.api.constants.FileMode.WITHAUX"]], "area (esmpy.api.constants.griditem attribute)": [[4, "esmpy.api.constants.GridItem.AREA"]], "griditem (class in esmpy.api.constants)": [[4, "esmpy.api.constants.GridItem"]], "mask (esmpy.api.constants.griditem attribute)": [[4, "esmpy.api.constants.GridItem.MASK"]], "cart (esmpy.api.constants.linetype attribute)": [[5, "esmpy.api.constants.LineType.CART"]], "great_circle (esmpy.api.constants.linetype attribute)": [[5, "esmpy.api.constants.LineType.GREAT_CIRCLE"]], "linetype (class in esmpy.api.constants)": [[5, "esmpy.api.constants.LineType"]], "logkind (class in esmpy.api.constants)": [[6, "esmpy.api.constants.LogKind"]], "multi (esmpy.api.constants.logkind attribute)": [[6, "esmpy.api.constants.LogKind.MULTI"]], "none (esmpy.api.constants.logkind attribute)": [[6, "esmpy.api.constants.LogKind.NONE"]], "hex (esmpy.api.constants.meshelemtype attribute)": [[7, "esmpy.api.constants.MeshElemType.HEX"]], "meshelemtype (class in esmpy.api.constants)": [[7, "esmpy.api.constants.MeshElemType"]], "quad (esmpy.api.constants.meshelemtype attribute)": [[7, "esmpy.api.constants.MeshElemType.QUAD"]], "tetra (esmpy.api.constants.meshelemtype attribute)": [[7, "esmpy.api.constants.MeshElemType.TETRA"]], "tri (esmpy.api.constants.meshelemtype attribute)": [[7, "esmpy.api.constants.MeshElemType.TRI"]], "element (esmpy.api.constants.meshloc attribute)": [[8, "esmpy.api.constants.MeshLoc.ELEMENT"]], "meshloc (class in esmpy.api.constants)": [[8, "esmpy.api.constants.MeshLoc"]], "node (esmpy.api.constants.meshloc attribute)": [[8, "esmpy.api.constants.MeshLoc.NODE"]], "dstarea (esmpy.api.constants.normtype attribute)": [[9, "esmpy.api.constants.NormType.DSTAREA"]], "fracarea (esmpy.api.constants.normtype attribute)": [[9, "esmpy.api.constants.NormType.FRACAREA"]], "normtype (class in esmpy.api.constants)": [[9, "esmpy.api.constants.NormType"]], "bipole (esmpy.api.constants.polekind attribute)": [[10, "esmpy.api.constants.PoleKind.BIPOLE"]], "monopole (esmpy.api.constants.polekind attribute)": [[10, "esmpy.api.constants.PoleKind.MONOPOLE"]], "none (esmpy.api.constants.polekind attribute)": [[10, "esmpy.api.constants.PoleKind.NONE"]], "polekind (class in esmpy.api.constants)": [[10, "esmpy.api.constants.PoleKind"]], "allavg (esmpy.api.constants.polemethod attribute)": [[11, "esmpy.api.constants.PoleMethod.ALLAVG"]], "none (esmpy.api.constants.polemethod attribute)": [[11, "esmpy.api.constants.PoleMethod.NONE"]], "npntavg (esmpy.api.constants.polemethod attribute)": [[11, "esmpy.api.constants.PoleMethod.NPNTAVG"]], "polemethod (class in esmpy.api.constants)": [[11, "esmpy.api.constants.PoleMethod"]], "teeth (esmpy.api.constants.polemethod attribute)": [[11, "esmpy.api.constants.PoleMethod.TEETH"]], "empty (esmpy.api.constants.region attribute)": [[12, "esmpy.api.constants.Region.EMPTY"]], "region (class in esmpy.api.constants)": [[12, "esmpy.api.constants.Region"]], "select (esmpy.api.constants.region attribute)": [[12, "esmpy.api.constants.Region.SELECT"]], "total (esmpy.api.constants.region attribute)": [[12, "esmpy.api.constants.Region.TOTAL"]], "bilinear (esmpy.api.constants.regridmethod attribute)": [[13, "esmpy.api.constants.RegridMethod.BILINEAR"]], "conserve (esmpy.api.constants.regridmethod attribute)": [[13, "esmpy.api.constants.RegridMethod.CONSERVE"]], "conserve_2nd (esmpy.api.constants.regridmethod attribute)": [[13, "esmpy.api.constants.RegridMethod.CONSERVE_2ND"]], "nearest_dtos (esmpy.api.constants.regridmethod attribute)": [[13, "esmpy.api.constants.RegridMethod.NEAREST_DTOS"]], "nearest_stod (esmpy.api.constants.regridmethod attribute)": [[13, "esmpy.api.constants.RegridMethod.NEAREST_STOD"]], "patch (esmpy.api.constants.regridmethod attribute)": [[13, "esmpy.api.constants.RegridMethod.PATCH"]], "regridmethod (class in esmpy.api.constants)": [[13, "esmpy.api.constants.RegridMethod"]], "center (esmpy.api.constants.staggerloc attribute)": [[14, "esmpy.api.constants.StaggerLoc.CENTER"]], "center_vcenter (esmpy.api.constants.staggerloc attribute)": [[14, "esmpy.api.constants.StaggerLoc.CENTER_VCENTER"]], "center_vface (esmpy.api.constants.staggerloc attribute)": [[14, "esmpy.api.constants.StaggerLoc.CENTER_VFACE"]], "corner (esmpy.api.constants.staggerloc attribute)": [[14, "esmpy.api.constants.StaggerLoc.CORNER"]], "corner_vcenter (esmpy.api.constants.staggerloc attribute)": [[14, "esmpy.api.constants.StaggerLoc.CORNER_VCENTER"]], "corner_vface (esmpy.api.constants.staggerloc attribute)": [[14, "esmpy.api.constants.StaggerLoc.CORNER_VFACE"]], "edge1 (esmpy.api.constants.staggerloc attribute)": [[14, "esmpy.api.constants.StaggerLoc.EDGE1"]], "edge1_vcenter (esmpy.api.constants.staggerloc attribute)": [[14, "esmpy.api.constants.StaggerLoc.EDGE1_VCENTER"]], "edge1_vface (esmpy.api.constants.staggerloc attribute)": [[14, "esmpy.api.constants.StaggerLoc.EDGE1_VFACE"]], "edge2 (esmpy.api.constants.staggerloc attribute)": [[14, "esmpy.api.constants.StaggerLoc.EDGE2"]], "edge2_vcenter (esmpy.api.constants.staggerloc attribute)": [[14, "esmpy.api.constants.StaggerLoc.EDGE2_VCENTER"]], "edge2_vface (esmpy.api.constants.staggerloc attribute)": [[14, "esmpy.api.constants.StaggerLoc.EDGE2_VFACE"]], "staggerloc (class in esmpy.api.constants)": [[14, "esmpy.api.constants.StaggerLoc"]], "i4 (esmpy.api.constants.typekind attribute)": [[15, "esmpy.api.constants.TypeKind.I4"]], "i8 (esmpy.api.constants.typekind attribute)": [[15, "esmpy.api.constants.TypeKind.I8"]], "r4 (esmpy.api.constants.typekind attribute)": [[15, "esmpy.api.constants.TypeKind.R4"]], "r8 (esmpy.api.constants.typekind attribute)": [[15, "esmpy.api.constants.TypeKind.R8"]], "typekind (class in esmpy.api.constants)": [[15, "esmpy.api.constants.TypeKind"]], "error (esmpy.api.constants.unmappedaction attribute)": [[16, "esmpy.api.constants.UnmappedAction.ERROR"]], "ignore (esmpy.api.constants.unmappedaction attribute)": [[16, "esmpy.api.constants.UnmappedAction.IGNORE"]], "unmappedaction (class in esmpy.api.constants)": [[16, "esmpy.api.constants.UnmappedAction"]], "field (class in esmpy.api.field)": [[20, "esmpy.api.field.Field"]], "copy() (esmpy.api.field.field method)": [[20, "esmpy.api.field.Field.copy"]], "data (esmpy.api.field.field property)": [[20, "esmpy.api.field.Field.data"]], "destroy() (esmpy.api.field.field method)": [[20, "esmpy.api.field.Field.destroy"]], "get_area() (esmpy.api.field.field method)": [[20, "esmpy.api.field.Field.get_area"]], "grid (esmpy.api.field.field property)": [[20, "esmpy.api.field.Field.grid"]], "lower_bounds (esmpy.api.field.field property)": [[20, "esmpy.api.field.Field.lower_bounds"]], "name (esmpy.api.field.field property)": [[20, "esmpy.api.field.Field.name"]], "ndbounds (esmpy.api.field.field property)": [[20, "esmpy.api.field.Field.ndbounds"]], "rank (esmpy.api.field.field property)": [[20, "esmpy.api.field.Field.rank"]], "read() (esmpy.api.field.field method)": [[20, "esmpy.api.field.Field.read"]], "staggerloc (esmpy.api.field.field property)": [[20, "esmpy.api.field.Field.staggerloc"]], "type (esmpy.api.field.field property)": [[20, "esmpy.api.field.Field.type"]], "upper_bounds (esmpy.api.field.field property)": [[20, "esmpy.api.field.Field.upper_bounds"]], "xd (esmpy.api.field.field property)": [[20, "esmpy.api.field.Field.xd"]], "grid (class in esmpy.api.grid)": [[21, "esmpy.api.grid.Grid"]], "add_coords() (esmpy.api.grid.grid method)": [[21, "esmpy.api.grid.Grid.add_coords"]], "add_item() (esmpy.api.grid.grid method)": [[21, "esmpy.api.grid.Grid.add_item"]], "area (esmpy.api.grid.grid property)": [[21, "esmpy.api.grid.Grid.area"]], "areatype (esmpy.api.grid.grid property)": [[21, "esmpy.api.grid.Grid.areatype"]], "coord_sys (esmpy.api.grid.grid property)": [[21, "esmpy.api.grid.Grid.coord_sys"]], "coords (esmpy.api.grid.grid property)": [[21, "esmpy.api.grid.Grid.coords"]], "copy() (esmpy.api.grid.grid method)": [[21, "esmpy.api.grid.Grid.copy"]], "destroy() (esmpy.api.grid.grid method)": [[21, "esmpy.api.grid.Grid.destroy"]], "get_coords() (esmpy.api.grid.grid method)": [[21, "esmpy.api.grid.Grid.get_coords"]], "get_item() (esmpy.api.grid.grid method)": [[21, "esmpy.api.grid.Grid.get_item"]], "has_corners (esmpy.api.grid.grid property)": [[21, "esmpy.api.grid.Grid.has_corners"]], "lower_bounds (esmpy.api.grid.grid property)": [[21, "esmpy.api.grid.Grid.lower_bounds"]], "mask (esmpy.api.grid.grid property)": [[21, "esmpy.api.grid.Grid.mask"]], "max_index (esmpy.api.grid.grid property)": [[21, "esmpy.api.grid.Grid.max_index"]], "num_peri_dims (esmpy.api.grid.grid property)": [[21, "esmpy.api.grid.Grid.num_peri_dims"]], "periodic_dim (esmpy.api.grid.grid property)": [[21, "esmpy.api.grid.Grid.periodic_dim"]], "pole_dim (esmpy.api.grid.grid property)": [[21, "esmpy.api.grid.Grid.pole_dim"]], "rank (esmpy.api.grid.grid property)": [[21, "esmpy.api.grid.Grid.rank"]], "size (esmpy.api.grid.grid property)": [[21, "esmpy.api.grid.Grid.size"]], "staggerloc (esmpy.api.grid.grid property)": [[21, "esmpy.api.grid.Grid.staggerloc"]], "type (esmpy.api.grid.grid property)": [[21, "esmpy.api.grid.Grid.type"]], "upper_bounds (esmpy.api.grid.grid property)": [[21, "esmpy.api.grid.Grid.upper_bounds"]], "esmpy": [[24, "module-esmpy"]], "module": [[24, "module-esmpy"]], "locstream (class in esmpy.api.locstream)": [[25, "esmpy.api.locstream.LocStream"]], "copy() (esmpy.api.locstream.locstream method)": [[25, "esmpy.api.locstream.LocStream.copy"]], "destroy() (esmpy.api.locstream.locstream method)": [[25, "esmpy.api.locstream.LocStream.destroy"]], "lower_bounds (esmpy.api.locstream.locstream property)": [[25, "esmpy.api.locstream.LocStream.lower_bounds"]], "name (esmpy.api.locstream.locstream property)": [[25, "esmpy.api.locstream.LocStream.name"]], "rank (esmpy.api.locstream.locstream property)": [[25, "esmpy.api.locstream.LocStream.rank"]], "size (esmpy.api.locstream.locstream property)": [[25, "esmpy.api.locstream.LocStream.size"]], "upper_bounds (esmpy.api.locstream.locstream property)": [[25, "esmpy.api.locstream.LocStream.upper_bounds"]], "manager (class in esmpy.api.esmpymanager)": [[26, "esmpy.api.esmpymanager.Manager"]], "barrier() (esmpy.api.esmpymanager.manager method)": [[26, "esmpy.api.esmpymanager.Manager.barrier"]], "local_pet (esmpy.api.esmpymanager.manager property)": [[26, "esmpy.api.esmpymanager.Manager.local_pet"]], "moab (esmpy.api.esmpymanager.manager property)": [[26, "esmpy.api.esmpymanager.Manager.moab"]], "pet_count (esmpy.api.esmpymanager.manager property)": [[26, "esmpy.api.esmpymanager.Manager.pet_count"]], "set_moab() (esmpy.api.esmpymanager.manager method)": [[26, "esmpy.api.esmpymanager.Manager.set_moab"]], "mesh (class in esmpy.api.mesh)": [[27, "esmpy.api.mesh.Mesh"]], "add_elements() (esmpy.api.mesh.mesh method)": [[27, "esmpy.api.mesh.Mesh.add_elements"]], "add_nodes() (esmpy.api.mesh.mesh method)": [[27, "esmpy.api.mesh.Mesh.add_nodes"]], "area (esmpy.api.mesh.mesh property)": [[27, "esmpy.api.mesh.Mesh.area"]], "coord_sys (esmpy.api.mesh.mesh property)": [[27, "esmpy.api.mesh.Mesh.coord_sys"]], "coords (esmpy.api.mesh.mesh property)": [[27, "esmpy.api.mesh.Mesh.coords"]], "copy() (esmpy.api.mesh.mesh method)": [[27, "esmpy.api.mesh.Mesh.copy"]], "destroy() (esmpy.api.mesh.mesh method)": [[27, "esmpy.api.mesh.Mesh.destroy"]], "free_memory() (esmpy.api.mesh.mesh method)": [[27, "esmpy.api.mesh.Mesh.free_memory"]], "get_coords() (esmpy.api.mesh.mesh method)": [[27, "esmpy.api.mesh.Mesh.get_coords"]], "mask (esmpy.api.mesh.mesh property)": [[27, "esmpy.api.mesh.Mesh.mask"]], "rank (esmpy.api.mesh.mesh property)": [[27, "esmpy.api.mesh.Mesh.rank"]], "size (esmpy.api.mesh.mesh property)": [[27, "esmpy.api.mesh.Mesh.size"]], "size_owned (esmpy.api.mesh.mesh property)": [[27, "esmpy.api.mesh.Mesh.size_owned"]], "regrid (class in esmpy.api.regrid)": [[28, "esmpy.api.regrid.Regrid"]], "__call__() (esmpy.api.regrid.regrid method)": [[28, "esmpy.api.regrid.Regrid.__call__"]], "copy() (esmpy.api.regrid.regrid method)": [[28, "esmpy.api.regrid.Regrid.copy"]], "destroy() (esmpy.api.regrid.regrid method)": [[28, "esmpy.api.regrid.Regrid.destroy"]], "get_factors() (esmpy.api.regrid.regrid method)": [[28, "esmpy.api.regrid.Regrid.get_factors"]], "get_weights_dict() (esmpy.api.regrid.regrid method)": [[28, "esmpy.api.regrid.Regrid.get_weights_dict"]], "regridfromfile (class in esmpy.api.regrid)": [[29, "esmpy.api.regrid.RegridFromFile"]], "__call__() (esmpy.api.regrid.regridfromfile method)": [[29, "esmpy.api.regrid.RegridFromFile.__call__"]], "copy() (esmpy.api.regrid.regridfromfile method)": [[29, "esmpy.api.regrid.RegridFromFile.copy"]], "destroy() (esmpy.api.regrid.regridfromfile method)": [[29, "esmpy.api.regrid.RegridFromFile.destroy"]]}}) \ No newline at end of file

OZ%H$Viqqm7fd}CB?tWg;@d%v32g>JG4i5|6I z=$qvo(_;%`_5kU(vZqgrW_qv#%EiH7mTQk58rOq1$so+t~TULk4 zrX*;ly|VxdV$%9Tz_HlW;9}8`45}OK_p53N1wAQo_OI?NWN`mesN z{1WC2WOsj{kUEkHgoZQXcdhQ;YR#bwKwx%;L^wbB(oP?@f{h)# zBA!4MYecOGr)UcMj)x`bjRT|{SG#>g=hWwQzBy0r7Ysv>Y{kefvFSMFCGDHj`*=tL z%3{hBYvhDh0(jG&d6kUa$ct z@Ypl#sC~n;q{~+#Z#$aJ9SJ^(*Ed6UEcA6lQmh=ChECbLCXEwsOdef4)zyXDfsCJA zzBOqS7+@a~Mhvm)fhVCo^5S2jdp7#MYmk?N%aRYqyG51k>3!9Tx=6gs}cQ~)Fx19JMJC6F?>B$Gi8E*d76FV97|hgByfMG*&JD?vD=@1#14M1 z_8@Pu9NphicU_{~K&yUz+B=3}a`+Td_&wgXPyq_!{SUX|<~%vAODRI;@l?V_>u)4u zI1j0_MGB=o)sRORw8zd5#@NjeS2uo`T%nN&kFh8Gb7r6inTu?P zdpg!}?XYw-L>I0YQy4@@1Z^$z#jR)TD!fIbn8;01Y5=3MsL6viHnX<0MQUj|%@f4O z*(`guUlCwiRZD4lj2)x~rO}KCCOMFJn5(K)W$Ncfw(vZGh;Q@_Iu!wBctLdRqI#RE z8RdEKBp7zj*(m}Z8OeT8s1vlG`+|dqg=i)zbJd|O;V74h0}U+ueo)1=PhIRgl2O2H zlTdT8KM=gig6Yp99KdwaZ;&pM$}gQyt!rONP0je9#7+o^_>joYa~9*PT@LlfD0~;C`(pmU7btu@m)0#IYJ< zjoO%T$cR7j_k8l1VN=QUpZ2aQMJ2I4jc_DE%exEPVI%xXiWv37g9hNP(s_1=5o$FL z0_s>Q+|LXM7u6fnDAZ-|2TI3X&C5`z2fd2ADQ})u_A_$kvg2HnmP>Nvij4cFskW`pxos^427@Va#Ta( zFGRbKS&ViIn@6YM?wlM|9uZEynJPl!5w#d(5DE!L#~IC9`hy!PrScqfIei;SyhLe8 zu3z(W3YX)1gW)Azblw}}5f)U#hCg2npZEmxUQCP^ zkxBRDTXo4u9JIF-vIaymhWATG52F{(nQtjHZjc)~Bi?Rty2FuIO&|ZN-r&G{HB+HE0fCWk zv~6b)r_epT%RT^l;(BIu>-9;Q+oU67)I^ea^~#q^u@LMw6_PQFFl|%B`kCN4ODDYZ z3uoDlM)S^2rYplSg|TUQ4t5KcUo#T%Olf=2rSZG#d!(_Czb^PRdZ6weDzsyd4mi+S z9HFH6146zrk|Zj<*90Ue>I5^{E#3=}Om33+UAnk^Y903=p>^RVJ5ENn;)=x0HY%IE+tHw;d?$WR-fr37)KrthLuZ$13qrhht8N zIdeF{@;JpUzk5=9ekv|sWJ*c^6M$V@mOf1W{<+>#QfVwKl%~Bij9gdFFr|$Y?odv$ zrGxeL=e1AC@_utmJ=9!VKs!_Ax0G>}DW?4Ntd^KBl7r?QfXKqLcU4^6XiHjwOroN^ zp{YzvoE1Y(0=oOwn&x~gpvJ_$6?dq+e*crT)S_}6he!brBW_?1+#n^4MM#Eh zrhR}Vsk(>G^t96CT1^X98Nh&@77xJ$`<|RBl1yC}x*?dy#8Y$SuBm1($#ilxTvu>! zI2jZpq~t21Yl<98m~8gs#fY_}(Mu%sOC6t~d3e_xgPP5@<+IipQvuC90b$7}#4ghU z1*vMaa4DYy9hhLfp$Y)}8=x-LE2K**dt_Jg%#!6>^4!Csky}{ZSEEsx2;zV|E$>Qj zSy(P`AdlG#vn1c#(O5zXh?``0mDy*5=GsQ2kLC*MuVYi+YHJfQHt`FW`@ zII@?@Ww%2Cp4V~xit;h0a*-`y`CtMt`8nh-@X&5qn#?r%V7XZMy4I_iDB#7`s-4+1 zZRxwUb$xmi_LkYC1SAohPudlNw>gBs_6*85*A;DP3|y+7@fn7#s|KKI+@b>)#zM>G z{jyAov1ER+V{ICa`4x#sgqx$c*vdJYP4Pw-()HOg=W!E|tvAq1qx^XFz4WTXT+T3w z)Qwz-^utfG6z-He$MYF?VS{VW5fLElsf<*7!*+`*YX-Q{iWrn5Y__;*aq{S%lFTMj zFFKOMS2xU_IPvJ1#KAkGD6&llwcByZUdG&bk{L?|S$x2ZU(3FKRk;lMirVy@j7o>; z6O7Gxi*ap>LTmf8Yeb*G#WJRBYWEnowz5C0n*7PWw1$W zp1_(Qy{Qf{W=<2l42=4NQWFC_J#)`Je@-%V1?@209m^!d#Q!n*7?+soFfF%}KZDrf%sZ?#_=(%3YP->7BBq%?4=W_MtWv3)zyy;tw_i zxmXUEj=P+!+FjC4(uA=^Y%W1OfSkZp^r~-h-*S$Xz_~6y5;?UJ+LtkW%GMjoT>9es zW9Sa9SkrVG&6CNc*BTj-QO8E3TjzWpta!%njKy-*IbYJSsW9QJh>D{Q@(YmwMa(+y8kXfp4rE6pU4w9omKX#OOsMBeoY;N)NJ zlE)yPJSZ#pDS$UK^W>3!3+)#3nM%dXIIOd;(I0LwdFy9JU(4FszUxOgJQFCD67q_s zulS7}#QnGg88tpn`;m~>?caiy&cr+T`8glk)6#m5W7FntZL%-p19Q1}3uwGjcBovc z*%>g=TA3~Dsf@ASf0-NVy-XS#{W@MWKvLFv6)bVFG*Wjh%O5hOXqFYl9&;sSL}GG# zjDPqvxtjHf%@AA{H!PYdDQ-%(V<+HskVwY$mZm;og54b@hwOEcCQ#S+@asHg{Uxwv-N?LdKuoX8|K0h|cj{%wP*`j5r%=8Dw*bCeprxL`g!vGPSSLBhS z)X&|O!O;p4@f%?+B73EpMJp4esVOXa3Z4)KpsH^MsgxFue$WK3i z8C^=kwfA$Lc>cL%|I6H3D&6c`(I+ox@6lWt`z)G^9fG9Agvjv6RowucQPB^KHYFeO zJjN`AYKoKDN+0+*AI;iWxKj~#>iD@g9JowFhGk!T+VMi;_mC=&H^~`SOEF9! znx~SU3A;+cXaH9@gTo78=Q=Hf@WD;3y61?salt-rU9Ws6yqaMhNnw}stx9M+hrF4~ z)OshOBpkaAQ)g>IQN7kD*qfC}m+fP9>EPgrSgHMsA06pl5K)LBHrY2tn2TW9ls2!| z%AtU>AI5u72mB7jMegSZ>8!X`)x5Oc>Rk$MvUzoKgWX0H zCt0|vpE3|PdTQRn{g?xlZNa3UI37;VZZ_^jMMUX+rU#$hTrZjmQ`BNIfVPSI$+oGe z{D6Xewc2$nvJZ4~YHuEpKZ{+Sp4Sl$^LqPM!CjH@zI640rNEGfukT008c6o2QPAE6 z>6c^WBy&xO&n+ls;4EF1Wyc&SmwLWH^J97RCRnK4)Zbe;aAqr8(I(*M>3F)FPQ&&v z+sJ-?mNEj{Ekx_cN>kjR%#`9WDK@0Uxmaircg}$x@Q6K!tU8QO)G8>B1Y38QWCKk0!&GSE|PO*iHhOk zgICD&`G>PAlm?Otnx)&rG#4jZ8u;j(GK!j$tPJ|j<#lkW&vei0W6?l{`C;Q&i5eLl zB$#WcnhJ3etB9?@ZW2`4kh)+*=Cq%$G#q=>>|q2k0P`UA6K$v~uh1AptU6j5@#<9( zs*HYhr276?8;7Y7m8IzMH=3P_W+8`RFdAI=`K|ZdxBdHV#xU0CWUUKaXs}hD#jDU3 zyAYeq9_dHu)0QDJ9@$^EB&AR`Rpo7hNFp=YJeON6T|Th2MXbnw;J#>Y!N;-_p=s0Q z%!_YL3wZ|yPraCB)3B$*XVVl^joZw0d?fYB=NF!k*n#nVBduIy$mi6RCs&8*X6d*( z@Lc(&`&M1Hx49OwaT_UAa3txHu!$d?2V4gJ%PWOLN%^XNF$366kiMl6l5J)4=bILs zOH>s$`F7?l)c!9m<(_!?&(x7vF^6g4+dF{sbMl~ws0bO1p9=(|z(IJ@vWoTfx^xa*z&pvq9Q6-Q0)Jt91U2S_7elhphDK3}(NDenA$F`?op;>aNhAbB$v8&Qe^b?;Q z@1IaFYcp3-2o+gWUMp38nf zKya$QtMu^U^J%`Z0upPA`;8^|0KiOK7iS~FP5=R2c`6@B_C-$(R0Io%5QAwss9&My z)32sC;W@-wK5*KP&B^dN@_+j{ThFR#bN#fEnLWxw3qv365Lti3%dlDleBH{gu zOs3wKf5uU_s)+j8&a_Q`=OZk?;18xZuHdd@7kmenFLc+2o#vZQ0h#PSUXs~Fo@@On zS=@GA*y?sgmhH3HPsjPWN(J(uk0QI@7xj+sATMIrY$(TmhDB5$vJ$o5y{ucN>U_U@%PPm7HqF+ z!Txq(Ls`IeF%Zq`oEvNYixVDEeU^~l1?+U*R>uBw2SMHkO(?-0y$15QZDf6lW~Qev zTRQ6ZIo;i~(`u2@(#_~ruB5g#!on5qIHL{?R&TE(V~tILrLjVuI^#|C=VIj}!;sfV zs+{CnhuXU+Z51N~ffR%E@|3AK^kkDn2B=kOj=3fX_tP zF}8)hI#@11*XUrH;XKKwDujJ95(KZZ=rXe{mt7z>40Qgn!M1JCkX|l&XjVF|Su;Rq z6WM_`JU}szwKY(8t#oDmKHbA}*fj!pQ=Vsz>OYA~N+ zPVTjQ5_3OTbi6ybx)&@HRo>m2&#Rwsqk1xDT2|v{vmP}%$s&G%g+LZrtdDEN=v!9b zDasAYIa*VZ#MVmL@j3<>m1$mnusn^wM)-!6SM|aV?x_`;-XjQ%rTyhor?0s?&~cxr zr%Xbgso{4bV}gSeD*Nc{?&L0%?byV3t^F|CeEb{9ZUPuh<)(g((G zp}dYWQ5Y1~BG045?zwC-vgy9z@<~$KI-GdQZi6v_{hO~WW0t$OD^$h!BD2tJ* z$in*j2=V7f0%TCaoEUz1GcxRtr(6+hcUE&nl{LNOb$rr=dO;E^fWCPvl0vX5&f0Y2 zEk|q%PzY4o%Gyb0FnsD-Lkld;zjsd7`i4L_H9H#j{skw|@Pw?Vxs4vchum?)(kxn! zU>NLL_wBavO3ik zmouCL)P)GY99=s|vnrf;8`hF2fK4X9GR=>)qJ$gavlfOc39PQmt1Wd#NezA{VN7PXX$$uUaB|m z+nZD8&$2SvaVJBRZVBt(O_33s9fj^Yt-kdaP#Ah;jQ%v3S;SZ$R>EjylCvc3py6>e zX@tG5y-ISkG86GEx^fwjL{8sQziT==wem>c-03k&+|#lZ1Ihye(Q03_Vcrcdi6h4< z+>k9(k-j-ZjbAf(@BK=e60?E2?TczcnA{JLAK?ja@InbQb~yYHuA`>%_^SqZD;6tY zkz0x=80g~Mi!RsJc${c)t|Myf7U@AK#OEGKO6m5!O(W1Om+_$cF~u)U(i<0=QisVv zZo-m#j3W@K=}sVI{vDbDDG=eAiT{r8g-gy9DXu|#RMbuUWBmneB+w5Vi!Q$`#Ys}B zKMl;yE^TWx*2)eS_glUsc$>Q0TR_M`|Aet-mZLj{OzQh92xHr})g4!g+_9VIQ2sM` zqa!`)DunZrUaJd}J!Ah*7ioGEnzU5VoNTxV^X9SSu1xtGMQr}L{b`*q3%;ZRiu5rN z?8`2@*8zNeq>cto8gQuGbEyC%L`H-~a4|L;!@l$*1LTnGk35J@ycf;{B-Ys{B3!>1 ztG>kAAgqSvqp4ljo=Llx1G7djV6 z!TMT~ufC`i&~);Yi|LKJ2mj2yq~N;NKUKh{U3}5j5dRcx^(ik`1q-#k@Z$8qLOr=L zo#3Za;Npv7%{FpmE*>31ggyJ2!ZG_L??I3-Pa7_tcEINS@Gf{;I1kquXJ-ZSIyV?P z)YCF|05lj=)v@N%Y0oEhMhJTEJjjB9LL>6pwZ`60=M#jmW|N8}>>{_^0c=DhpN;g= z1}i?iAb`EUeX*VTtVXQruw{96;#u93^j#Z4U~X1v_>ki&Y(VB#{|nMLwGFBZoDy6% z*U2AK$8EVUBhI-_kpyIjLyWafeo@FMBlI3Z)f3e10kTMGDNI^$#kZluZ-Cqt%sTR+ z(_?&Uk>M|?%5OB0{NUjtin$>Mu!YRe%9W>f?gmaBhIHqvYjtB?8GBh6DW#ox!Rr~P z$v>Ds*I|^|Jk9A3R`)sSK2#(QVl+8Xj4#6e5_*AiQ>a0XKeEH5AHle0ybui{#yb!Q zWc(2<#q_LYsAT&l?Nn|gUu8u%T|t+U1W+jAUwzZEBP!A_x^(vPl~sY<1j-$ zPI#C6kuT7dHM##iUi+mxm)&d)p@Xn3(nTufho>({n$>IxyFHL@d5`xxEEs2B z_oeq?;v2s75rI2h80;^V*c2aDQXkhuV#Yl(ucntt$kaw4LokLZRw9wkHoT)9k9vQZ zE{_-y|R3%21Uvv@Qt zG_UIoae(Zv1W8Lin0Jt=b8!S<(@#v?>=-cOxEc&yke^K_uC$cz3lBm99i*6RAKVPe zbl}V6_hy7`2@}DWGapROvnJltVV?nZ61r*8W2#`~dgm8drsBIl57jJ5iU9`?!DfUX zCQE1Y5ol@*Q%<0s?K3Z+*LMkG;GkckUYXi^k_h4~rqHIon$K?JHw2IO_!@H(?`0xC z3j1m#f4@1dkyhFMc{{Whyc1e(DD06~3W@#UX0GxV)#d&<1ar!<$Z+(k-8=x57MzpRnUU8ofg1|A2!&9DdwxqBCQYCqBCM%Dcxc~f( znfm%(;=7U2S{>;z1ZcJZk~96scaP?1w?B*DFmTj+FOW;;JwnwPzWd1(LHEEzQG*-O zh&v{zVu<&A79?9YP&UC4g7zK?A+mFYE4-=D%RWxXA>mtsqPL>qV`wHfMsQ|Q=9Sia zk9j_`5Hzw=IoPycXPh6@7^4utA{**tm>pm6w1X(oz`p@2(uGRm5wD^^qHeI5-Do-2 zg3f1*v-K(@HA(9!zu!r)agC!YH?;HI*LvxLBUp+w{1HAY=+Hw_sQp8!9hrIByY!v1 zhM;^>=>?%TS}=>zgYmqyDKTQHi&8x$TUkf^1nJB{xy0t5ol~OkE#=0z%Y(XmlV;=U zAYO<0X*F6dj&Yej9Z7T1e`HPdQe$i}mnYRRwn4Pncaa@h6)_>@X>D|X|IhBUb4ZJZzgDnyM`L=4T(R-5fsVjEuHM(07c|~0a=hAe7 zlIXDa{W1Y%GPxi`knWEa_OKA53B)Xg!%-}^m8Mj|%Poo5c!Rfzq0w@^*RERm7NI;Z zh2%}RJ*v?t+xnh)!~jo6Cne}--^9W;gg*B0%CAU7VmF7xkurj#jsNBCEW47-AXYD) zX`FeZ(4N=@ECZHDXpZt5#O#0hbxS>3H|#nYl&@gF^^uX08qzAHk6L46!X%ku0mf6L z65`o}7d7k%%PhqH_txO&NfVXYwq$!p=PDG=@?1uSrwf)H@p``9xN=k5^Up*-;cz?i zCZE=#dnCA5zTZCY%3Py!dcM6Mc76ExjbZ5i$9Wh2>bKD!P@yrpXq@6cLWD{KT1s4# zpJ1a2UWDkrpE1mST8nT9#Nw^!AIEDHlOGOmTQQgvwN0WXR&h8hr+cK{J0}xW@lJgU zm`{2uT$1REN8z($kjLQROP*#LzMgT^6igx%{;Gw+vs)vSrHT|xw6?IM2qqU3Pt-iJ zH*PO{)F-!Aff2aErO-b6u zSv;4`#IZWX3aj}8L%)i5RX9agxpZATPgAQ)m&rG_o0=Ze=UZKh}y&* zfgU|5PBeJIy!jqHAI>KFl2Hk}fw^V5c%N3`p;iz{6>&dEW< z6rzw-_h>&93A@dQ0zxMZsT5CL*fO2fn7Sp4bT||$12C2Xj+(oLYCVV%)$f z>uWJ|AyelvN(i$aZuJB0DZ_44+xaWY7ZPIk!*x?-CM7K}A@cu?n@IhIe5^5g`mKV@FyZCRBrL=C91&w+>1!Iovc%pye z*2?|$tF<8e($;TuMKg$oQ5UQMse%7KxNRl`aYW(W!i@<-VKgc{JVs$$P^ipu%;>d1 z9YzY(59LZB2-^$3hLL*XT>17&b_^!Pv~It^j$j3cfz5cSUS0_VbqJoNcudDQf1)R{ zJ|rEg3Eue0-M8LrrUb$?MSr1XhE`udxxe_GN3abRf=hy;2)d~cw?IzH_C^ZYLnaD@ z#GK#?x&qlsY2ViSe82f*RT>SNArU$IiS$B*g6GGN$=o4}N^vKLLxrU)C5)8AAI>wb zdWOZF%7&?8sN}C9bf#2R?LL?u=aR0`>=1|&E&H(6rFCSY_|qb+_}Jl0-5rOsO_4W! zd~gstR5_azUpQ>Wud`-3Z+|j{shz7$N_(C{(|0bfa+p#tLLLj_B|I8 z{-&ry;zGKY?qbmU03D4Zg^qm1SabdR3RzJ2ilWzdo;Tju#w&9y+lBSH0gGtk9RX+N zfa7e3EPUlk8F%bSM^SQqGI4ZwyDw45Xu3##IHpyuK0dYcY>CUVyj3IIS(}wzfNHt` zQ#}2BXqQLdU=|TxIJje@aY=AkChfx5iM+&vSjot2qY%R9a{`lMXL9J z)Dwe+uZT}}05N_giqZhHb-J0Wfzd`r1NREIedffhvz#|LIl%h*A+x^o{}VY8#_m%O z*%y(NsPK{5s#E|-B;tHbG1WAIJmK4y6TgfGfwkQf@9z=FglhHw)#n#X@Uvq6Mz%G2 zO#vC2{5*)T;;Uca6sSXYMG%3@%cRH$GwsY`m`bacC(?XudG(M~EOl(CyebhH78?wg z0$T!Ejw(nxDnU14UZ+emtk!fsX)GR6Wktd6r!sYVyEen?0{jN>nv$T^!-{fi$wMFV zq3Nu}MJcL?A(vfw3xnJ}qH}HrxwvJ(gQgsDTyrBWE2S;KD5N;K-=NvQgk0l}Gl@P~ z@66yhp*Hv>Ykkb1*HAhKPy%p5t}K1BcQy&f4{6Jk(P_9^GQJ=Jq zH)2;7DR)vwrmSV&`^prFAw-n!`L+eTC{E)*V&k)t(#>QXWMoesrN9;!EN2zw*2+ibgl@o!cIsRp zljebPa8V;df*sGl`+mk><6Ea4aj_Z9d>ex9gA6%XY^ymGS}Xo-1yz8r6H9&FyPL0+ zcR_Z51d|Fi$Z94$Uc{IY7`P65#2v&CL+mQVB`n0zk@3b?4)HY(8$wZ1@ zuIB;gLxnn9eP)(p0Y0_&JlsPy z>6fpBh42$b%Z?Y#5~775TPTp_PY<4>Ax5YTBI=U(-NN~c_Z z%qaAnn7ZEDf?1y$@??W}`R{XTXGbZ5b$$!H>e93MLpAAbIa0_d2{1 z9gVa(A^$)CWtZIcqZTbG`TBUxvnl{!`{r~;7id_P?_M>7q???pQN<(9(T2$(hmAJ8 zZPR>@y-B+BgGY7%%@UjtFzEnL)4?6pd{FdXAL-})zvy7ESq^U)3s+gaH|xi+9aH_# zwq0c84q(l+bm{~hz9$B`c(v~sUATuv%iCJvtheJhHy)|y0S?*ytLzs$Vu(VEdQ5;} z72p8a8iI*nYC+qGwL^=tTx^B?5IHsQJeHGDY@~l0E$Z+#)@RF1V25@%+--Ejf-tm6Pt*5}p=oI)6h25KU!1}f(ZUs5`YE_f2-CF+HW zCBkaE#KKuKC2^(;9GOwrq*tWz%QQrH*QQZnH)NEyIe=}d^X2jEE~}pXU{}BYROk8B zp!JQJsS88Pj1@SecVxx40eX$}t~7YYi%)(46QuGih(VL# z)&0VXA%8(;FH!DqL~C5#vh)+H)}NNZ{kf}l>(LrE-zE$;kh57Pg741(1A|8t#48*N zQx;5*;98QFH$2DYzp~<7j$Xm%Y@G&PuG#s;yUiUjVp|DbsKS*ofSZ6oi@CNOE!_sz zs#hOZ0crc_h6K56vneN|Z}q%iDBvT+n%z6OU1Rnm^=}{_@|iY5Bt0?(xs&zJ+fXJo z5py;;eHRL}FO~gsY4Hq96pPyWD}mpwbCXHke0RBF2khYH?VGylvZB`M@!%Gyg4VgW zlM{B##NBu7T(Fz^oyZo6tkC9I zc$?JcH+vZPc-t=V#i1$g+Fp&i7b+o!vKdi-GaaDTUm=5@xL1bVlrGZb+B7 zMbBqE_`i{{BtY2mtp(g$WwWnhhsZGzkFR(tty{%IC#yw6Hk%X8P4>AB(JV=*XYNB) zn6A;Uuvcazbw#^=y$>}W-yY)Jk<|FNfC>dUt^Ph+4jGu&Cj5bHH900l&A$a~IrNdg z9Z=M_$^{@tqPHSqPnlW-p6zcZ8&Sup_hV|Mfnn9;Z0tSX}$x zMyv_?7qL%a)i;7Ny>&dXGm#&alDHPfCK~hE_2F`lK#PmIPNQ8z#HcaQKg$s$Q%(h~ zZ%lNZ`3s}*d0*gzLiIE& zIg49rYA)h^`X4`GFqBzA7U1bQ766W@{=?`SjWse!j(Bz9Sw0>3!b?)o7^rxtu|Odf zd2va?57TQgSUM(@{>3h3TXh*I%@kI@dA3IX4+3HyyP_ty2R&_?{x z<%WToMtXb>iMI6{x82gLvKC~6qE*#zNe%hcVa(=AAz1|ism6$eDyk!+{qQ#^C}6kCHO>>cIx-HyOB z_R*!b;nS4IABrZ>ZTmUAI_e{^FNfE5j{}%r7B66Es z0qZal!b?JIMYc-ah{OSiHu09ACh37h6Y#84KDhW@EJNkdsY);%I=x^J6sk^w9&VJ~TXCDz!Cu1Drpbcm@KCKZ)wig`x8Yo6d5 zOnZmq_0$lLUUzPD-FayS79$~;90(TS%DFkx!w%%e9Kz!6h`DiUN-g-%n|7|$^(aeo z3p2}n$I-)y?Lxs zQipyoVZQEBwCEJiqYx?hMWQIZcxa2;ThtG$J4IG+43IT@!1O2PIlJ!RGb z5G*_8!?52Ph+0B=&X|zzQJ=kZ3QlHYH~@*nUe4HGLM!!|U67aSVNeQ(FEODpqigqU z4$*BY&&diN(mIIG9qvC^J;#myN`ma{BuXDJGYcFfmD|VS1;nt&_OYI3Y#3Jm_QH~% z%XXs2G6svN9fwUh=xfiD*zryDvYu9Hv)^vt)_zEOz-e`zhN(PbuQ2&NvrcC9e&fXX z6EoJ$IGKd#vCejvTu+zK^*((ViwrZluqDgB8!xrIfjaSjXM_#eL-N=Vwe%=X+4*-P z>?r6LctWVhZBiKSzEREoVqLTD&M5pRb7AL;wP3{y1GZcL$+mazlxi)2ZRZEpTdt1qw*`S5b`*q$g5^+Vx;`8ljhi*<4`_tfS)nROeyXCT1j%Zi)!CV&}r5 zT#*lk)viv|0W*Vh`<=WV&XjSYj~!GS3Hk-nAN%#^^2PCqe7fe6SQTTpI|=4pFQGo3 zhSi=?i69`*1dBcnUWk-OAONX|Hj^>D*S`%AsI3IxOP8R2xowbeHBpGY|3F7LYDMMi$z3kOs|dT3qNJaT)CIlq zT5#0S2}cSYQMs$WA{UpoLDgs&FXfsRg^g0lU__j7J4gv@3|z(2 z)O(&zH{#0r3v1&dX zko;OWV}r0+kUwi5WKV?>(GZ>Gp3-ronP(hAVjl2p^Dnt?L=g&Ds?nc%J?Pr*ztii? zq`20GkM-!YDJL1a;i1}7H|pH4tQe__2Y7*vxFG^MWRWE*293)Wg4y-2^( z%lFRWpVvi@0DAdUE8gr5Plbv9#fI1B5Bq+i;ChR7 z^94G+H^gJJ{4Qd{qhBHynd`rSpz$`_K+mAIBe;O``sS^dQ194^ATs^Uqg7f85LR+b zA0oCBiWeFJ1+Iq14KDu8qCrm0D-gIHDkd%fefyu_hX>`8G3^!rh z-PKGuoiPqS2UHNyZagcl;d&&Cx17XC1a@q<+vYGMi*Z?JFAC*>H4`*5jx<%KF!B!I=6A*R(e_4|UHH2CE(=c6!a&Adyr^>LQ;o$ikA|B3tsf z<1>p?YMr#M;qq>9K(9;3W*i@QCNOt@edNpT>UOHX-s zJIn^pm;hx++L?dQp7Au(M4cb#TsJtzD8EDSqrFPmKW^%%0tk%+zcxwewN7}+rDL|B zkGQ4Ra1cL;c9m*21@nfpy4s$4_4plk^8K9qa0$ZE!?Ig;x=Pu=8m~(^d~Jj?PwZVZ z6knP;V`7`##u+TV_izW0BpvLZfQPR{7*M(v9^2yLsrdiO-emjV*qiL^{}+3ck&X5L z!QSLxWajw)WpB2d$ZIbk(MEdNuK@xL=md3vxRC+F+};i#ZSUwH;}7iYK-xmy-p*zn zi#yKpsNDT_i`-;>bgH@e(OA{+$R|)$Fh-`YV+0W2Sm$79WT@`~E%R$C;>O~$#23Mi zM<^`MZi4iW4i63n2#b)MLI81Ut#3pE=LpyVZqJ?qh!~mGHxT*9goONyfWilD1my@! zAq60U_vaqRC_goTHw2vr@B=2{A~O>u%12g*ZDeVx2VDr18NR;e!KRs>&hh)$H~c<< z(6>B$j{@8O2M;j5gJFCH5_|bPRY8u-k7jOda&~HL0tm2~31FOYoB;skYO7xW>OVS* zrVqjhu9*dNE$!DOua+XO04iQVUP)E4$Oy>%U$k#4zr7*8e*?!nqWLw9qcc!@K)-`O zDe2!n4Qw-Lc}7q_{QPP*q_o1y$nNg!L!L%NMP-E)1HiBd$}%wkJ}j7ja%UwbFuwpS z^>@vO2-G(yzLAw7;I|1aT>)ufX$|qf0b&Q3p+-Co^^j|X{;-2 zA25LVbWYCA9wSp%M+ZYj2RjGT21h2thSt(ARKBS#;OxNc0u;cnGl)izZ`%6ED#$jv znLS}2&bK8!|Lh>Tw$%JxF@OG^qz57>h6JPvi>Q4Ix*uxx1741qqpRC*PE_Q7(9Q1Q zKgB;na|2k%&z(BGUg>_B)_PY%An>oSez0u^dLn!IGe0v}+vq2{!PUQgAbX&I{@7nP z&*@VARoUr3?aSeBDr8X!5l|LU4h#lJP?d;1>Kp7oc6(QbFOx4nlXtulCUDN5QtGl| zV(@xE&Go=CICCqQ(=!-nR|g>Z@6-Uic*qgHNI0PI4tCC8Nts_g$}vB)w>sDG&48ta zrq@Tn&Y!n^ARC=*?!U`7zt%-`?t3)ZS=qmPh)=VUngK$4I~wc1Kd-l`{WK{=2abE) z6Jx;o06esN+SGa$#HOYOKx8+;PZrcew0$^^Ee=omzqlGZ6RR`RtCv3JQnXgmzDgK+ zhXym%wibJPz=`lbCm!|SXE9SSN3ePTez^S_YwOu>s^hzud#UM9DVW;OxU`-eo_-Yb z8<58ade8vA`0i}~+I>V9XTT5lpPF~M;NeMF`UZMeFgvgNh`{HquIQQy9RD{wL;57Y zieC=AjpMO>o|E#P)>wz=>nt1+tkj#w? zZXWz<|C0e_=Ic!?eZzyJ$tI%R;vJxcRS8?JubRf%*Rw-uMye z*2BGn2XvtS2<)ef{)uMm=QQN7w72~w+S`98uCISL{H-{fCiUS{`C~kf0k=c-mEFt% z-4oLXjRBk+|E3|b%PjH5!%hz_AI2fS>dn8<)%B%rb+G@Q0CW#u(?OJejPZcCGoRwV zp5kxysrs9s`3cy|RR0F<57+z!>hrSt;Zv~(@zt^ql(z0`{7J#n2JGaW>l=0b$p>w0 z{eccFF`s?)i;{L7g;E@64vall?wFpQXPz0A)Yg!oF$|k(=!vbPkVp zfaq)NY5-MN`>lbSgNF}zts_6}`#w9Qd*ff|zfMg+{CKW$bPI#k*>t*b#*SO1iaOz6 zVGL?ix}}4E+5$8i>ggfP5om~pBeT}S8n>-uW+&6}?cNa1ZGQ|Kd2R;nDsjpq) ztquR8pNOG)8cR>K)!POwRz0o7tfb#OoCj44KO$7c&(gTA&mr{F#({R0zq;kxhZ^l) zb8ghPG-SF0xiXnYsnu;Rfbis{P4JsCP!T=b2gk8>SnhGN;>Ad6WSwy z4yUqAd2y_9P~$?LqK4xhWKH{`almB+H1$|H-}96vG+UZz_q1hvycUp(=^YULA>rm9 z;FAp{Oi_hfe2eiV_e)_a=YJJZVrD;({&|Ju3A!>OsmS3EJqgTBsC3dHUskUYGpamH z-;TU9Wr7XVAC_1t;u`eKGHstH%(OJ#FK=WCVg?~cKv{y1O;!>wcdgy135x{H0OsBU zLX_eP%#>6y4GOE(h8xCuSofF2p z`Ol!Cim=sfl2|QnsQAl6@7o;JPNUCDTx`6er;{Pa~jDH@2 zUuz6$`7`wfQ&=UyQJYBcsGL?42aoXV(v9#2Dt1R*c>%}zIax|8di?Sa?D}F@e7rI> zq8tbMp)y$`#WIQuY>JMwTsRn^a6df<1sO*VOd?T-iG|PUa{4`)HaS`&7o!KltfR(i z+)`Daoo}o~9Sse_$K51PB_X%yHAihCJ07IaMIxZfx@d?b4=qMH3^=lXE?=O_3`(+0 zuK_M#Zs-*Qw~@MP(?SexBhJ~YicTJ_MDmP9#%or)vyEWC>6{CY zVaE8nHv`Y6<^&bXLJS2=>j6;0At5^012LzgfLRcjxdORkvr~glDI*2Xu_C$B6mr&> z!Y!?0{O9HgKHM2H14dg|hnZ9O*ldhNOq-b%MDT?rb_fy8x|)4sD~`L zL;51h+Quh&5;6v}Bs{13buM;tNFQFEH+sc$D&J?Mu{uDzP?TcAvz)(F-{{S{Wj3nU z>6DMaXBIi0BC^vOZbhURPW$pZ)t7FzbJyxH*VCPj(|KBf?o(wXbC@zc*8Vq9>OE6b z^xtd3Pb$~xd>PofJ#A)sD$)R%I^0j>T!b*v4F^)j8o-VxTp0w6>sbh%OoLVw`1*sSC8nxsEfa zVZ4KiPfQh3?Np%7nRzF!*31wZt}py*=XSqB>IOT{V~9{fa{NiUfsh{1>ds>mHBg;* z=)K#Mi=~WXB>r?tX}cW!t7?LtuV6+ zBo=xvra?5Xt%P9w0srn!{ksz;>_R)xC#Ga;0N;|o=Kk-C3hR@cxx!#wP>JllF?fEB zlmUmDOqgtUb=2_xW+8hEVnduI`>^JL!(t5W;76rh61fRwtn7c4{I@Q?gEn zO3BXBT0#}){6krxlNQ|j;^VcN{7yv8#NHxB-nk7Z7^ZoQd1*zizh(0UYAmKZa>^7t z?(N7{rMbwhunywA$uYtcmmr?aRv@#RrqD1wu<)Dr`0PPjYC=nu zi%qgc^F^3}15&LMdTP88fGC{z{b-&E(%b>@E1MF0D!F~p-#hJGY;|_`W@7DYVtFD+ zk)POV$@l?z0r%NEt}$P}vQ@bfU#C;j&fAX^>u0gx*$Q{88}@G)h(%8^ejVn~TP`~P z3%U5YhOynAnc2bGkq>8zwfra~cKs9XM28FCGHnie*rNj?OG)LvEUBvZy6T`2J+gFA z_%=wzCoNK!qk_5)Qx~;4)tiLO#3N?7LrKra-HqVI>{i@ZpF1zC4&rjO8Qs_0n`DLb zseS%?>yWdXEk=8B1uyBtQ2X2h7GjM&HB}F37UR>1VOsLE<)wr=&Yy)y(XC#B>N#8R zT?QX{$?a?p4P~<|p`1($O$EZ?ArfYq)<3yib1osKXc^lqN@nRAEL`7&JcMp{7^5{@ z)bJmWlW$7T^uu~t;Jt2g#;p?DsLEaiX}W0@x&D?NMp;Q!Bp>`TGmC7B)CQXz)$RWl zJhY!D6a$p#sc{} z&yh(09pzPgACOhavOJ4Gm6jMz4PJW}^hPJFMnN4@#0fxtt7{T5kSolb%0nQx&md&O zr-1DhLE57aup2XDV3?k~JnDf+ixj8jtkp8eII$8HTH2ZFEl7BiadnA`kqXHbL{poO z!3wntFkOFJ&otXnE5L>cbN_Vhs`k6)#ZV5A6*7@*Z%n$_jo`EzFb7=NGHnzV-z|-Z zBliEbnJZM%DwaGqbH+3@dmL;$U|{-eeUt|2 zfuxs0SY-V@2casB7`P&9_?T>XmVH@+$Yne6(6U%vA54g^NocC$x!#GaX64C*=)(>q$BiuGOYHATc}5Dd>c-?;bSTBdYattBhNc`8W1fu}v!E4FS^DX4 zs$*(c?OUG^9?d^h4D7|jV*Q3oh?8G6>CIY?nKDCWuZA-Y9-}*kec|MiM$;!;V_r{( zv46tDOtsNDCPUlN;OZ8|Z(|Ff+ueCV1Q(69Qnkc6Z#r|xoW=X9Z(7>owa$gA5jDLx zOSkFK&Csywmv_|&2BVKGpzIV!NMW(nWj`aa0<%=4PoGQGHkkqR|1w7cozW?WVMTRm z%2D36)|9$Lm&qEAFL*!I7p>mCA>0JpEXW-Sl{~@~;IX=pPKJC_CU!pB8d3JchTF!Lib;D)L{97G5=z9-}R7m~^``B%UCF=vfGc&_$PDhA{WB1-gS6a8wm(;KJs`wB zQ|UP$=JGEynNk)T)e?C7V5zAsY!tPvU0T2H^!AAOK7d2EveV)N`L^QKor#_W-N-*U z@t`GD)A$r&wkljJY^9E#I-KVi*ov*maMKX8$cs|Y!gu!h;pU^9EnrBrcror3Wh$vd zvJcA8g=X_R$a15RR*SXfmOt>TOx@fAOnhu&k}KS$Zj#g5sWIqGDsLy09K0`kBCAx>Yadg;iI>gui6qw zhW!UjcnE~e|lyxeiE>tEoeg2l89#&&;&HQBhr7^aI{8A@?{_aD+ zX`4)(2L>`1k84?*Ep1x-*jU@8x2EdokW05}Iugl9IA~tm?IHa4`$%#+J|%AJIYl{i zI+X?acOD!Cv+2_XaAJW<&a&Q6!K-ANBcwC%m54x7sZM6dx03f!7q;Y|r?27I)$ZE1 z$u#a;c=2N0jfP>C06UM|4^3Uabs4|S@3axamR)E%0lTgOGwPGYZDG?iJM`4bMq%=j zbTD$5?Mg+*5o-^A6E?egJ$lz-(7@-~2krshtvB8pV4Qzfwtwv! z*>vB{RLxP9jn`2u-=|N9?AZ1eXl-Fz4ZcimVN|I?F1g%K@HcFG153%s5Fil&`j9C+l@^!o6v34{#HWbZnWqhX zFH6j4``oCNu}(&$K86fb08L=vB@@4KeUX<8MG!MD?jKrrNRaHuJP z=&67naF@W*6N>5ti^}*x`v;8r%EQ@hKBjM-!t)FX0ULN0BPxE>BU_FQ%_dig4cDlK zNP?6Qc7_h$HlxOhgy;EcJIC`(b8@h8r+2pLM^1^Ia9o)wVn&vFtEeLsCYvzRAp1RT zZJrYU#a&YWmyY+h;TJ+CsJLQIPTAV2#}&ZUA!X~o;u1|u4MEB)k&@ZOAPC8)Ms!|V z!e`?;!ScX!eyeIoV-CU!$k#X)LymI#u7CWJ5`3CS9#Kv=gCKvMNk^h+%=j;BOy~(b z2P#Nh>g)>~DNYv6(Mq(NwoNb_F_(5fVCQNM8glSrz#4qJye>G6M!X4J zEXi7~>A-po1Mol=8d?zy)XO_TYvfu<+ZtI)1my|wE>?|MzT}O5b8&TN=zdv{Ks(Il zWW6$`fex9OL*v=OHoHeFq|L+m1!ol6e11SQ*mR}#i=_VcN~UW+s~XP28L*B}3_t1l)a z6UYS-kxP{@NZ3h!@UoxW%pz;z5GJj4-!;$&Q4?HAw!#lFUM$)!9^JZKDvfF|NB=_& z?d=aQQijUj+q|*1`)57!E?y0BYt8pPNUaS@AO}R5DUiKQsWd|Q*b?}i10CPxofvNixK;St zTdY-v5+gfKuUWjcxjY5t-J_h z{?Sh5{|phlP-K@7wqpCa^+3DQWT8=o`$(j-%{pUr?uu>jeD{!*+F6RZT&ESQEA1{5m<$f=HHdElcZ&oEtm0Yn zNi!VBI=TdMue64u`2}K|@?m^<;JbgvB@bsMV}hBks7-ob3{T=yTovHmalPBqBB>~Fliyo|< zem~!UQL>E#&y9LplKx}X?p3nvN?@MZz~LW9|C#f}5xQctY|gYQm%xOUyTN5jBuJox zyluJ}nMkwPvpE*9{9_PweBjIU5b0lh#1I995EmWv`++EjlGy;*patf&x%&lfC=k)p)GuCbBCG!Osp6I7#C=z&NGeYHnis?Ex zD7@Zx#4p^RH7;WX#w4@vjKRI55ru*>gA#Du>a-Qo*ovg0o!}y1`>WCJbG0)%6KATo z;VnJDwUUKy7A2&?0cuhc&-Q!1rtT~T^U#GKe%$M1^AuM&{>(k4XQ|gF;*2xet4Mcr zH3E@6bfiXjKky8lJ9eMUp`9mHWR`)8h~5U}iK13$F?yt14nYwZx~&aST0N7(vYwxL zjiFeGGKI-8&JZ(VYq0>z+?QsaN8y!bwv;CGrujGkRYRBnuQ+t)`{3&k=s^u&bUrgC zq!ayuA-+B}2NKzLfu%DbvE;-SW7)?!h)-cH@2GIeh* zp=s7X1r}>Ux=qEfQWb2*psGvFS+q7D!xLb^H6W+F$lFS*ut3!IUrRpF8w;HIL>WSf zpo0@h-NE1V`swaQ6zhfJWx36|6f!$Va=1R`z~@fsgc^Jl=Ha<+D<3ZPROeG4*@e?3 zw&#?JM|haaNtf-utQy>~I0vMQ>RfQDGTKTAO>xHfs7Qb^*8|*0Z7`4Y6BVmv^jY|B za)+*kcn|@KMd3L1xae8%C_S`V1qO&>d-*!w4ZqbHD=p}CwM~<`)~Sl4JUfRo+23G6 z&D0qgZY^jonnF_cXpBUJV;&5?1cXypkb@3jHZv)2)s z&t{{lW3;f3Z`A9Tm<@v zwdpusVSI7N{#&}4w>jz;(oAz>27W3#Gm3spU$;nxuV#w@NiLf#?uZK~l;N96jTkyn zkLBa|4-VI!9m!E9TlRD$)k_Q;B4~4de}JyyEh;@pJ86BoYwUbYTqa6K+BWE9ni*Ij z*>dr=sTPs#zfYs&XO~8`BmTVaj)#Z#sVi(Bq^e`SvLsfxz+O~_;=fGu>9cGk6YI8M z>67_g6mN~#XZudXYkE7UxM5k7vK?=9=uL2gQS_{vz>!}w^Q6lRg|l#Q&7l-B4H-ay?m)+pXs1pfm4QM(H6>B2gn>cPc(!$2tP5O z^fULy*NT}=iN4b7X~NBFx#EFoZAw#$fqNyF-C}LfnT%mY+!}h%prrsqEa#Z#1*4{9 z+$57jTF;V6q1;D}EwiBO?u!i2_D%-M%sXsWtEpr#xiQbnT8e!mfUF+?|q790HGv+W7|(gt)C z^<*-E%Hc-Q{Tw?-u!P_d#4M%8rzsLl{(|(;1*5&oUYef?>#*6wzap0BH z|6)y~gfP5S-;a+nCj&@q2AGjLi3*Km<*o*GD@<>Em zh0&J06u8`5ew-7L&|!#!!x`MZMpD3sjbUs@4UQpHqMgH;;RyanzutyK?7)}G=*UDV zy+hNn_0HLWeHO8YfpTv;P7^29rL1qFS%E}+(rI8-yH<&$;Qr_y-hJ8*XK#afC8nJ0 z`qcE^c`Dm^-AiV?s1Y-XX?QY{i@~XaRQvu^yMH2;Q{yWG1tXIDq~<9q^)pnpuq)v3 zFU!hgutr^BniMy09+n`l#rzwL@-5B-B}b9GcF(Ni?xY@heN3Fd@3yW4zsSqqC` z#=U7tQ^aSf^12DLt*Oi#Ns5e;yM|M8LeV1EX^JUFX2H4LubC;Kr8^J~kUQO|kotDn<4>s_fl`=Q^H^@rLPk7|UOy4kT=C zC1ip58Ast()l2e`)JlZ(ZI|3Nc1ta1_9J+8X#ceMVu+m0Zlp0j4gcq&9k)_t-5rUcWGakN7M$DfJ zmVLijNF^k@1qjOnjc0v_!n!6c+yfXtKXj{}Pr^85Hs?#kggBAbT8QEF;?8-n4^^%~ zrJ<$9?x3}LIk}4#C{>EuwiII%RubT!OIjagD}jzC$(~V~3eU!T4zh8{U0N7B-ESsb zJ!RZeDvDTkkM2X{l52bi3J!4PMY|yUo{2?LfMeFEZaML|S6?<&shezhRLqc6s@O?l z!*jEK?x*k2mfWz0h9q6>l>~Y$wpRDOH*bq+qgEl)GA<+Ztr9Hh0O#>i&%{|O$g-px zX8`ElG)yk$OR(dUQ3Ow= z$|aD-b`-(Lse1CAR2+4Aim^&n972mH1Fc;(8wdj6;16;o3pu!@R9PGX(`0$#&yki3 zTNc}+*qGO~#)DO0w5oQ|ucf!GOxN_cJb%hhjCA-{snaQ|ehsWu*3q^)9M0-6r?ehw zvQ*QGXo24f`h-=Y&4tCs-_b`g>Xkx4=Ic$W%bt7LgJY9aRL#Vx|1LCQrgvqR9(8eZ z7)>ivPujb})2sn${DgOk!z`8iCfPtl<^}%o9;St}8f;m^OViY;<_5$+SfX_jO^>XG zPaTWUb>)qp(Dl@JzO57|+NH=^OY*@p(m&I{?c=Du+Dr`CT&=UZYoqDyM(Qj0c&BYP zRW10N{Z;5?*Q2=YCkw8t2XyO`&2Vv!mQ%3>`NNg*j0nbX2Tj5%+DhHAOX;R{xY=Y> zI(*<_!bxh0$>%0*6C(B01E*qt*jHlo;w2<_Q3Dse46xBT`6yu$DL@ext4;OR2S6M^!)Nc-kgW)UIlHYSyE^mqG~vURbo3Y$W&Q988f z6~~1IVh;4_bl@$Ctn%1>=`emNol9;1Rym3tWFaZ8dL3&_M(FPGAxqjOCKMutL)-I) z3CUQSRaLm@4A|5`ZF{x{CoCkbcreQ|8MpH5P8e9!OC!$II$l1^>{$dwVEHXJx84ZJ zX@S^Hl77gTHZ)o@E{rXsiYc<}1Hl;NXASgKEX zDNftw2d>^npPGpx`|On}sd&(I+GoB9`^|Df;8zz7_1TA0iXyyUuMZKrgK~sRuHUne z5h?>R>Vl<6elVSb{iJ1=Xell9OF#$|7-ag0!w9mJ+)dA5sKny*gwd+>0i#~1LQO*d z73&rmnJ)#^Ps4nnu>|f-jJx>R`fb%tx;uO+`*-E1U>pcKhQ&+)b4aEdC1uQia6ZRP zyDezAP?AjVrRiD!FX4es1FuiVB)9kQAk)XFkGXg%YEy%49|X^VqMUbAm{gJKv0SL| zEe54PC)M>e2Y3`S2PJYVsK|y3t2evBQo@j&k2!5AFIbsTNA4I`)x3gTVjHG4dta!y zKraeEm~!nXHA)XMrF_{JUGaaM=fyi8M%Iq_ytafX$AfUe=)tB^!1yNRTj9n5o&qdbCP#ch3L^Ki#EWoL@DccgITW`cP?^^FV z_pudu*|Ws2I@vf9Ir>BWca?){5{z~#7qU1?rj4*-yCPkXP^A`FeURDD>F(Qh+yI!0 zgykurG!_+}f^>sou~)3SM+{Gdk;Xmn^wQE`M{CyLI)-mql1{#AT7sZ~&O+U`0-@asS zPi^TR=`jI?m|-KJ2>y_mLDSCC@^aGE7W?S_fB#=lkksYP5@XT9W`i$A|N7l@DF;(cP$LdcPw$j$0sTl zfi-2DmR{z;&v>YYXI~ZvjuhS@b7)W{4PgHjPMX0raP@{6Af1aU*9I0Tv+33B>5wwU zXIUa>guL9zti9@i4|EQU3}Y}9*MFbSg9wO*JPdID-W&zg;dX{_ign%h3cD{y?%NH% z1y>pw;!a{FL+ll0cQu%5OKacXv_kIHP#hYi$eDMAiW-7yllt?46jU#tPZ6d?R3@p- zt>y*0ruUYJ)`O@ww^65Dwy>@v!t!10?Qjf3BLHeOd zYsPOk1r)mdyhq1#!8*4GoF3Tqn6^GA{g@sC1TXA{HHD58Zf_R!ZOUfR&BYNaoOpw! za7}%;VFh9#0Cd%gADsyBhtvGr%SCsWeYf#r?u#?Bt z^geX2Uw@{fpV^jZZ5}^T9A8m9$26TA-!C!>F?MC6_wjCPjxpDjU22(<4su)u1{dz9 zKN?7}>kT=>bCh@A%A^KP4hzp$S^#vo=ebY`q?Jy#@`^Ta$ux*iTAWzAygG;@$bN)5 zS6kW4az0H1OEZ?-m#v|ENH{CHNz2`Swk6UB@}>k?!aI(NrCA-f;aae1l|^O40|!+r zdxRWy<(PI&g(tZt2#du0?5ch~Ppv?&nyNQ$T6#@0foC6fc|BhOXk~BRuISbqR?+ux zow#r=`#^DbOa+TGTRxoC?O;!`>O+amU(TL%#BPr4>f)@+7rZm*=xRe118A#a_EIU# zIVR1ZN{x)aQE=Aq6L_;-GFjB5@ZL~8hByB~W_}wFkBnop>t_UHHw7i$$HsNjp&V*C zFI+tsB;?Zh15C^s!;IvGo))0$)ZaT)Y$fy`QECb4{)NWdeUKq}nb~>j2C5SB&G_W= zelr{58<$cFoH~Z~k$V}KRF#gB1^y_&viBeHd1lP3lth9MAw#*eJH%Cas_#%YM?;lc zdY^o5%D@u5xv*AEwYEY6r63cW>VWX+avC_#j)*kG;cw-JeR-G!XW0#zLZ^J%-^GzepvI6we8rqGM|QYJ46iOn zw^c_a+s1XS;R~Y1wRj1B^O&y^4syE2xPXq&D8s>0U$M=k(_M6D>{0HeplwzO>0pe< zaH;dl14IEHK)ISx3fQ0JQpxys+@DC-^XbM2{h;TSs(+V0e3UKOKfud+r$wnw8lqVt zI(GGcHv_GSdKy$kzO!8OUp z0@03A8l&{hx2j&ceyh6FTt!=dlU#1GktDp#eN(;(I%20H%7agOL2SF~T2@SF$N|nz)cC>o$&XN zI1iEe3(Vb5vEm8eG82JVIf6OzEg`d0GE|O2OS(klBppI0d^-2weTDK}QQsw;%1nK( zN^~P#5llVLQB;I;3Jf!jE0JMHo})<83dGp zab)Nn2S36II;h}sAb4iMI&dRt_uBf;GHCd-6Tfy(t(~95RXY-CSdD!8Rl>4|b5oT! zvORLnqAe?-7l>*gr?`!KSjw?BlA`!ph!;HsAT>%vaofZbJv&Mg zoeCC0%Wmvl;MtMaIOMw#;CUlh^rsu92?^;O&LxR)Oo(gN2G#l7DI%(^@CYT+de>;B zpJz^~XaOOanor;WeLi!wFnYA=HT~^zAPNQAP|)0m7+KYf(Ob^GL!bnzcSm$EOJ^1@ zI0bZ<6LfZ`GiT+z47E>_GI@A3uhYV+|KBvx*x(I%-fvl3x_ZtwOL=-kk9!>E z4fO_}F@nFNrCHT!m{v3doN7y8`C*B6`<{h(BrAUX`m7~-0o1<2j?kUSDP)=8Le zEiLq{!r_@Kn1~ftt&a-dlNhq8MAH)IlDI?8(mhP|qvth^^umg)Tc$w=45jp1!|@}_ zifr#M2xtp6rizQeaB!}%3gKN^Klb<1T#eLBEIG0usZd$qy87UM!}04N8>E0Jsepwj zL-k&y)CC;dQXHD%6r#2DrC!J)+({^(G0Tj9?kGI&DT4&|=V-yUY%Ix!1qA5#F?`x_ zvM;|?X~EG?Bk${OAsP`(i44q$Bm7NkTu({z5IV zsoy?-aWrxA{Uw-oZ!qvd$AY&?)o7o;ay1{(z?Ml@dmBX#z)MCk!rf^`qlKY1yk z8a@hK?-=^~r4FKTQ~@n-f!TW*s|pzB>&~EC-weQUNq20} zilgZ=R~oXW40T46SyYHK`FNOeRFi;3g;6qtJ;*oR(kjF!a5B4OODfwxv+mlaI=u0E zEZtWl63@f7EGSn7Z`c(qqkAMZ zZ2Z|ISn^G9d@;osmKc(xoC^3=h;E1h(Bcy|Brt4pgwPsd!S;j~8wPHnv8|HmV2ZT5 z@k_?V?d0{ei$hf&(jeb1)KG~Z5DWq|dr?4R+R70NfOgV8wPHNkcO9?0j3Iud0i+m#_7pBA|>~Iht}^WP|gK&3lB=$zf{Fg?7`k;_5#; zi4m8S8N5gllIy4tQ10o&{&iNgL7`8-q6njkC$5HG?Uk!gzv^;1!XDL;4~C;CEhU5Q ze;f7gzaYQ~*DKa_@LU>>l}-utHcmOm zIG;H_v9noem*X7<=Uu47)bdC)NDlL=7d++b`>N6{*>I(Tdf^s9bJW6!hB4UYxp157lDj*$B3 zp{=#KhE#f7J9z#Fk45UiDS*KB1JwuWCtuH?aYPe3nysCEpBr_(3ayd@}3WQ_1h zcW&5aXJR^+2y)j~#2^m!<}lns-ISSs6Z;JK`Idhx_wOX-p&VLM-QL{wdq(}LI~L)-axJUZ+cUreQYZYwk~ud$d%Va~_N zaWkSI4MaqhV_?-(r*mRRJyDu~3vJ>{hf3d(E7RAon!zEi=I!vb08OOHYJfz@w8_cT zfJE*SXcc##qQUF-VjDE@@H$>0Y@ZV!<(Ey~%8){IuuPG`G#7>Q%6 z(Fu}ExQAuSKrN<)sWsa7?=Kw&-YF7bKX9i7Y7rbM#_k17#aXmSV_TtmJ@iRF+_r=L*COC{D zxIZU^Z@s1B5XOIdnwTNJaB41Kp9oV_0WCEOHe0Q`Fh7vJn00Fway@4NmHx)s*EL5a z5;g^i34)j>lymY-;us|glViHiZJjV0+;PIr>ZTtjB8?GX{Y+o8(vW2;&hf>^c$Ev9?=f&;#UAClIPpU)Fr!Vw3eeu5@`q zfxi(g=2@IngC!k<-KU8curjkDFibd4dMpfj1Ou8P1?L%whIE)~kwAt92UW_ZEd zopHy2QWa7omG%DCBHdq^^Tyfd`8+zLVjfy;!?QXD7{bBq_QrF_G)=Kj)Rmm1a*f-T zu4{YAS#{*8hpFv1!XF+Z3=2BujB^u+4)bINZ!cr<{z~_he#)L6cYmc1D$(6(U5^qq zv_&lj1+qX6&1CT`e$W>i)xTmZ==ni9V7IgK&oBaEu|O7n;FcJFw-k}pk%@n35bF(x z)T$TR;^rj#Oh1IZcJWqFfVQ36oSj7;?K+p}x@KpX&>F}q9MWJNufFV>+<7 zcTk=|A-L4eWWa$s!Q|bvN+f>flprU_Z&3_Y{N67A+g!XVA_Iral7fVvCCfl^z>XFw zT6fPxG*tTDxe#~*9$f5NHX%F>LO65-T4?l!#G_UOvbHygbD0(jgWe-~p*V>wm+ku> z#?C25l&H<3ZR@se+qUiQ+qP}nwr$(CZQHgv_s?XKd64+yji0Gu%Q`dUb=#dPm8AVjSD`g4(=*z{Kpr`*^uj?DOl!6GPy}tQi9QxCFP?qwx zHizEj^+pguD(ijAM&f>orIjucR?6gZKXcbhI_y$Q%I7b@M54LESZALp^os&ILu2bM3-b9u&F-O%Ie#E|13xM z4hDSvS_Tn;s11OXWuxImLF$^Ahk{E)7L>H>V%$tRpegg;%(XN;HKJoN7xoR^t%kfq zRPi0caNqFa41dlJ7_Ha2q{+;*?=?PGV`6PgFRR?1Wz~uWvUg*|Ps4E5r_!QPFyG*U z(g}M}G6rp<%(54-(h~ZN-JbyXP2ps+#)aCy1%W^th8PV9+#>%*O zmvUsoJ#W0x#@UQjEupT(ao+a^NnBmx?LkUbW%^(g1r4t@$$b$b$apL=Bu{9r6`fEB zp?FKf2bdB`R^qKqQ4^fdR*&vrq&iA0_B47Fyg?;FM`^8{E0L-$r;rEucPRnL1J&HP zMbunmoG{ph-lyKs0Z@q%5$M*y%4$i~F2AFEzG77de4ojti=u`!|KOuS~2ryARN zSBVuJV|Jy+vw6j_VNohCGgi0tki@W-39_dHgm9zy%!l>ek6UGPA=^cN1}eA&Wc@5< zh(l9`1Da3d*FYd^0Lr}5YC1-NR6p)T7Q9weysb?E4ovhO6s?F4X+~&Pvc4p84-;!= zX3$7C=m}-6?A4NXj2IqN4rAG8+3z>y%=X2gKW)(J?g#j~O{8v~dlmiRDC99y%nm-72$O#1#)`K?P~Hsy`qKKdtzuQ_QLHo6YaH~Ll8Z5Wuq8pogyqff(9YJt^n ze(p`)b3l$UC}LUc37r)me1j)87Z$Xqm$Fe$sTF6M_-NZ1@!r4|A4i_czbM>M&`EQ# z(9V{-y>S3Y2TjV`Bh<)T`2)+?uUK{dtgccUiDvUUwEq}oF7m?cjMnLQ7YxeGRRVT< z7oR33ilro62CcBIal)#NQY<^z4d#kB0>c~riJ##f{;IPyJX?yTz*hmwFCJ}Hcpf)? zW8FrU@$I(L=J|MHV2`$NxK;RBli+?5x7NkT=o#LBX0rXay$7 zHe~iFa-Ri)JUjx7J4;57U+@9ns0?qP`ELWT?+L?Ak{#vsO(j88-NvpB%_ae^cjEAz zVj76NG91epjk~kUnW@g@-6WJFwH=z@sBLdBoEm}SL%)Q(q52Qd@OO*mC(YN|brzUx zjpJu6-8gQTV86 ze0@~z9~RF!Gv#eV@rxT+5}^Ac+{Z9E>Dus^kczITvveZu;j5as=@C0Spfk4X^O9P0 z)L3YC_Ks>)s6mKxSG6{iK+f}8)ChSS3ahzda8t7*TS}^dk=IHHTKKbdTTI-9H0PXt|fZ2 z#rl6=mohqxo$mn}suuPW2nmPfObtaA!u-@W#0kGpp0}mIcY#>KoK@ze#WMlfg#a+` z-l-^>O~RF|a_xDaf0LcG)_s$^5S%boax5WURdnTSEC?Nkb+;K}E>InXY(_$&6_#`> zj{d-EYBsARBVMD=Kbtm`-FU*7THzR$A(XvMiJTikz-Q+m=Z|>$V*SoK!rIgrCu!7m z_pIMLm<63s|2cjsNq3vJ@==CsbtT-SLhE&sD~8;_;zU*vr%6{K`nt&#@=2EVbts=! z_`*%=3K}LYCfQoQ5j`ZCgbQBkd$m~Hro!N*^2S;A*g$Qa9eG&PTUmJ~j@{QPqvUAG zbpI+HOf}&wT~2kmr9ZHScN0#Dlw~12uX@31S=kDqCD`B2g7DsLV`rtJ+!wty^TAM~ zxMx*ESq?vE@X_~nA47~6$z%LGOeM^{4L>>2dB~pX5=8o7F%ds|ST#W8U=2j`XH%Qv zPToq+h24zCsM?4DMauFqln6hOhD>I~Y+9YFFgMbmDWa?3UA z7S}I>;_rLp5HqGOG#?sD1<{HCfO)DM(dlCj$g3XuOw}}L z!lX5#*tCvBWcPJilnTfP=EOv^y8fmtb|43##5G(VI@lhF1WrDY^la?x1Zb`xl)#VM`OvkvyK5zhf0ac#z_UoG>_(8bV>AVb2t8p6AG0 z$l&!wELaC=*8Ka8{x!bk)JAzHpC2qbu^>|ipQ6fR=+1C&tCADxKe=-XVT69Ucy&JtefM!cwCzApTw!jyB)e<2Xs%4UYn}0w+Ss!F22rEydh$|Qx`LKXV zcDv35s|khwsd^>U~{%VG-6vr?**H~ zB>X^a_&J7Yj{ta#;*iWe0B@*{OiQ!>fl3)@90^NGF=o7(heX(c5Hp0I>^gd z$!C$Y9MPS=@98#0?zCK|>wAb|z4hFz{R;J^qY`!+9m=orpHvAZKcnQ=U6sK;46VAK z68ic0G31Pi$YoF(z1oHNkp-8NdT45lKm$(Y7YC%???eN!U=lYOXgf~OF(Capw|&zA z0O3#}cX)zDBA$UF-2KK;5n36f+zWgaSbDv26+2l@1^PtaJeAY-6V#C+S&bOzd@Iz^ zqxW!2bjtQO>Y@9b2kw=ZlR6d?b~HP^lN^p|ru=iMUqI@onKm44C4UvOme{4VyYlTl zbhqS9YiKEKSGo=RV5oiQV>C=Xqct$fY!x#}54g9e5H=t`8Wl;`o3LPdAFz`+HT2Y=nbz+$_6ja98;W9WbdzVC7AH{ z!=4ubysiV?M|lmr|Hg20d~KCPP2o6gj~i(hJ{?*yt7O^Y6}=p;A(v1B!xi(N8D2CU zFS0D~OvM`mCuamX$uig1y`(mlR&;zpKN{{vjz?T+D=~7&B;v^QPB6y3gW$=TR?0F* zy|Nsx_<2s~W+W&vC3miyJpTdow8F#vUjEH(v1?DG;wz4(_d~#&DcJZ?+OLD`unPNt zR1JXfqCX0n2QbEPR2oaS|T~19R-ao{V*#{#0zU}+o^0f zwX)Zm@v^Jf2cHyaz_8f8CDBD;#d|pv*}DVVN-p9L74v#`X1 zifF3uqFzUN#xS1xmNQ(CzOF zmL8qM#4Hhs*3^@1BVhaDKmqNs@mh6lB+6^%E&|fE$K>P+ILi9nRgYphQ z;^^>ZE(blV;>H;|-PqP!mWvQ}Mh@xxNNW)kmj?C`|F-!%tYu`%V@6 zdHPJGW7?zX+a0PP%=h%mN8+iVH=EPf@j1d$~_S8&^f&EPpr^ z0|uDvYK8;%EB;QVq=!^|b6SIz3e8KZjM)HJo$HkIL?uG$pt?2Aef^ycg`It?E8yBh zWw=?tg=@#PM_pINwW%(qH8~vJTLrb%kZp1lat1dMz{f}WJUG6mRYv%(Q9K_i)m*R_ z+{nKggf{X5KvjBQ&;pY0D&g!JSi!5DDn>WR9w;_B!A zJSuxy6regp46A)7c)6r3W=P+E#P{XxXraS3zp+Y2%o)C9WXv;2L4Qe-#dSIu`1k2_ zuLir|s>?U~jm9Kow#;4SOMyxp;hDf6ML_yxiwzY|2N8Joi+`-rxeiI;L+kVg9f=42 z!Q^4v+5Ns?Q@!eV@g}D7gm@^*)}olHz&Dq+WDAnO5H6z|IXjPp9m1raGK)w|R5i*+ z+d5F)^>qS#$ueqMwcqSS0>RJ0qS2RK%2*OXPlKb zT31RbiuI(ip7G8rP5h%I8iB{rMe>>)GMHYE@e-6f1|MU~8O5!9fIO5A&?J?81f>v|ad4Xh zwk6dRX*i(docEOJCYv{(sk#}dPoR1A2v2=3bVCj%+b5W|N(WT?k!PcSUu;In)MH5H zTRp%}!a}afRUK}B-!BuO3a3_xMB_btvqUO;EVMOGBT)c>UE%8G5tN+Ok?>d20c4S| zsouW&@RV9fxa)u@MEHs}P+W6Df^(!8{i1_mayR7$gwP>C&yR}n!Sd!8!`DFK)QvEk z;M2#&Ao{_GM!3KU`aI_;cTm^?!Low!lVm5xZH}?3)q&yWR63WFz{NW&4H9JNeV%TX z8I$9GuRZt+Fs7S?8{%iKDwC7wD=TIQ!73&{C+0dC1Ev)E`T~5?p9Ko(Z&Ta)u>*-a zaqVMtHQJ7z76|EgZgHzz7swnC5WL`jw)PT?vQs`wpO77E3KC~LqWSV2SdDT-+2wO5 zC6ff7>jUfwiveslJguPhfl_~rzFoYMY`vf(EeE0A;j700_Gh)|owp`T!G#pZ8JM-9=qf5wW$$@r^o#$y}FD7B*OBPXqVE355Re2~r!>w&ih! zfan^Z`GGG1ZhSHMbERkicGNX8ohQ+1roa1$eL(#BgC~4_(RN4yl$q5xzUo3YECsgI zl!5Y70yw;^M8h->jDw`DrPblP%Z!6TY~`3$ z^3O6abQ?vORw;;_ModS7QU{frA^-K&#)goc5Z?%Z;*Fau;0gyZ-ad|TqD`kb8&b51 z8T}D|tfwJ(pA3ajMIQcq)a)TRt& zo_-P<7_AJm_O!GK2n6*!zwy%cL}%B1D+YNfmz;{+w>(!r z+l`D1c|zOFHPD@+>Tp4f(*F%S*#f?1CYLfi$U``J@+Ka>8rfv) zKrRqipK@O)-+2-jg@5W-jc7I7P)E}zWeT{;lj$fx&hotMoZ+^yb>tg@-3Rj`-ck zi}uKBu0pQhy*C+Mosb^ia1Qpf61YrL$M+pd?B&(2fk~Saw4@7@Wwo3yWQW!XOn1h0 z`_p^6+GRj)(y_ofbQJ6Ah@nVizul>ltzeFfNu=3A)SCzG=>lVpTI~#R1MwXPbFD|# zu%XI6^@XZdSEA6>V1@_%ZXR&5n8=2CF)Qp9oPPFE&;|_z*(p1+1F~tfIqxekt>oM? zNeeSdU@J8h$CO7Dmp>DNHuy2pxRx8P9Umt0`&muPb-&bTu{O6*$9gVl*=B&yO|5m#`w1UO_Qz&L?{5_l(U?TZ^zdb zh!$tU|YIFLn)V<&u@}%WT5R^Pl)qSL4(_RYD2O zNX$w82Y8$se*~(r<2ooB+C;HqAP_!Dz1UR>VWO2gMDOV(#Bi@H*fX7%)El}!M$o@f zMS9ueESGD2x5kR0jxZQ!5+mJ|Mf%~QaidxNF4>foUrH}tiQ3FbRW!8c;fbS2)Hxc) z8Jr8LW<<2sOLHo)#T?oqoL>$mnpg1%T5~@m*ku&n(hEKcZ*H1qY7$U$$XlDDleP0!{k9yQbe$ z_;!^}Q2~;-YB06s>KCkrlVCV^5ima2HEN)7JK;}U5*TX@dFCC}m>8YT6TF^g6s}-k z6kg?NRY5O8sBV)8<;n_OhwE3Ef|(SSL)N>?Tq$F+o2Z72b}wCjT9|U_b?XWkUriSP z2$&^(BSxHvxL((awb=Ur&7w|didp&03}(0jz!7pgyUswycUjZRGU=%&H`(Aq4GISG zQlM2e7%$IhVX<~JCWF%ZFp0o}JCRMBwzyyw^jSINR9@5gTK9W9vf$`s z>XhVyN2{PxY2+etlnEUY@SGsIbaeS><+ajhut` z!|m87cmO0Ch0n9ny%=stCB(WL5v!a1K8W^@5i;YZu7+Y5r%0_o-^r4?yU#Ef?5t(d z>ZG+-CG@n!KXb|O*2OOzkZXwyk`!ZNK;&{Fn-mE zVc|-G7*o0}vW|Q94ZMs7v5f8fiejuVnj36q@l;y}_HLr6D z?n*AT>Scc!Pp&lnX0IRzNu+caVD^w&g;|P2FtXutV#2^0{>_}&PdHz;`afj*AynehK9!m;1_-(R>zsIqbF8vfv_^!2G@%eV~oPO zDs=_<>-j%)xau1M`L#V;heLAPkafKZE_obxa^~?{NE*;x>t}7pM=PTjsRam!+-Q+k zY8mAbhlT?FMNBZ%Fu4uyu0H}w5#xtX3JH8y_`Q?9{|uYoI64N^WTN$NRh&Uft_*Dc zp~=I4?iex0&6hsT-L5fbmvOJ9Kk>-$a~&Y3xaI^2$_d>=YqS0cU_Q}rfm4rI%edjp zG0%?x6oi$FI9g(|UFSu4vbDXJj>|ZPTY6SNL^IGqv4t z3uY6X%6@ZNZZ;01-RK}3r_`*kiCBCKc2#_YTHs0KbW<>>d!q2XRMmDIkPP+2l(LxB zV#Jp#nH@|&{R|yXTZh1*(8+UX1}bKXiz5qN^9j7Q^=bS!!@(+Y-L`rdrv26N{F`=o~1EH}tdD ze-`so*Ni0xY~i%GLP2LAgrzc`gb|}O(8ulxB=uIOZUAkE1-!tuKVI2L#qTt0)TXDm zG{3AsFwIsLB3t}1lkPC&>8yyU5_?%Js!06TFOM?J+uPVdsj>aw*c>%7c$wzodgqOE&aDieNBus-y=^gsGpKW1?__^V-tCBbA>19iMcu{VlaFJ@0* zCQ?c(MH-b}Tx`0Qy#nR`WezP}7g_+5Wk^ZsYE%SjUgj1IMwdkAoY9T*K@`KXZIqr9 zwWOdp$2uY3?H<|!Pobz|A(w-VfA6*0 z2#Ha6NVG}~+xJG9gn?#xPAFE3uTgkR0fP6N2IdDx{j*si*zY(;$YMd#su|MxvJ_wB z3JVuFz_|oZBPQ_;e(SkBTN{~JAn7cO_YV5x@cIDe6X1&rhZuM#r3!PAWkjg1zcv9D zD&0PKQehTSMtB-wb*+|o?iRv4UKZ96Ew|gCTQAeb>OnNmVn`LgTwjxW%MUyQPBQnR zl|hmJ?S+IIJipR2pn?=zT+3SXPzQ_&xWP|lkk!up-e^#XEiM=nxP68e3G(161_5Z6 z(gG2=LIBv`YumKiDO0`|id76u$Z9TXDi2v{=|UZGOHc@<<@OCsqIZF`xKN zKM&b-M(XAHxKBz+`!0CFIIM+c_O#002I{a{yBpPI&k8G~-9dU9TTNX((B*Ai-0S$N z0x}5Cn=+sL;msJg6RY!U%9qn)`A@Z>R=d6LjLp0!6r{h zPXR_wtwCw(>U6okJNC`FfT+gLf>_L;i}wA*dUG@LIW^;YSCWFm&@*c;Y+L9${`pRX ziNISk9N7yR;XUg`0E{iJdhiQmM-!bwj4`QVtkN&=JTLBb-MMCKRYf4@ZgJ@iND!F} z=!DoEFn?o62$Z<_9#8x{8Yfz~JfX(Qy~eLwj5W?gmnJc{|B)N(`Ni&f6g#B(9J4tv zrfh)ZBu4D+{B@5u(;D%o1Z&qV4;%V`sD1j3DLz-?JP4n-iKPp{6dSOmjzRSE_WCXx z(=XwqR=4fe($O3fUkJc~vKK&pO@D%IcA9{93eCs|^__D73P^(}I@^i$9mGEk?>JiO z-bAepnT4$QnWL77&518GTD@}Y)x}jP6VE@s$;bmq%GoBtZWetUe^XA(cS5Mt? zq<4kt6-Ni=X0y?B9$*J8_BxAA~QN8u=e^g#duVu4{JZlh$vC?<>^nSa2aa21u(s9f% z<-PS(`-BPfXz(9NB$i#rAU>NrG}j$J3JH2%8?tsA)A24_|FOp(9Ma8q{KxSI)+HzvMVDs$DOO4wd7l? z`TTa)vzm$Eg}Q+KH|Gat=Q7AX=A6l?F_nEaFPqD`+%&LlD}yQTs@7R{a`f)xz9B95 zAsl%`8s?J{p){8KXIi`q8*AE})jt1{!yq6F@`t$neu>pjITAylTfS`E-Fgs!PoUbc zHN<0_Pl=OKq5Kt14fyipMK1qtp?r{>dU0`1nw0Z`rL{yfu`2^>ZwZJN zPO!2pL?FexUZf<5k23i5$blf7ge2-1uF(#2Fvs?}-!|=!Glf}!fT-!{mKT>4b>;9& z+*xxusF!!7TrF9a9VpbJ=9L}E=8?U5Sv)kHt3Gc1al;g$#GpA zlj-0yLWqilVfMa0L=m%3{dJUd=+C^ZsurA^mM55e$ge8_8YZ;aFeoqAnJri&`h#we zqXKSif?o$TAhXue5hJki*-F*!D`gk^@;5$3*1+vE659(r^)!=y9-4_KKIxPSsg$(~ zO49niX*_SExrl|kk)IDgg&z~yVG4el`MZiUqPu$S&;}g+D-QABZ;i7!L}&Q|u^1xH zQtIBMSlEMm8;(zXHo7=yCz0_YMPez~I1wv8G{>D7X6ol7$RxrO_~n8Rz@IsO=uU%Y zwIfQw+!>%Vw|8~&maDM7TGk18irB8gD2HlY>_?w|jtHb=_WCYL1$t{{DEijbx>79$ z)z^9d-vS$GD5YJKP0_KofJZh%ij>Ywk&doW$|)>Dp^QWcPv8;qGPzwno*)g()Dv31 zqNci@4os(kn)N#R0Z`hN;N_pVlSGnZW!G0EJw82S(dk> zGTwwU4s6_{DQ6=R;46C^haiteK%J>P9Y{M{18(0)uBmnmTPix0|Hj<7K-#l=g+IXm#RFsqF^cUdeK=8Rs**3|h8;zW3P!;oW!fQ;1+JzqopD2?rv?u-0JZ6xuH^J2s;SDjMP7AybB4G{@+oHz*it$6ij zng2|Q0^}^73}?)<*Ix=C)HuWo`-pbN&=@t9R%T^@yv`p`Ud2F8BhwdXJk(D$%)6^+ z8TqmRx%|76BXU52R!(6uD2%NDu1)NGm-#6=@Fs<$n|%9#veEQ-_S|YojlbB^)*%lA zprE(=hgzu3xt-9?VFDvr)^SQsi!ee;T%O?#1j?g}Onob{8u7_6p2(uZshmRn%n*Lp z#ei7u&6@v%P+Ls3skcW0o$1%LnZp5C)qc3C%cn35K6QfJnuOkuYBw z6EUH1^t7$LiMGV!2?Ga?6FOK(o-_*ZOJ(|t`Q7NLz&QT87IGM{GFrp0hCo@vN^-y>KxWY2ox?jvV@o`h)()N1c;S;)QHaPY7S3 z%Ppn;>t~s+8rn~b-DqIDNKiSaT0>?>s|iQbddT%`tR6^0tjnjPqePypjf-_R2GR1V zRaP|1%_>H){ttYkEq_CA=mrW!i{)}0$&xqpT#n5LiTeQZp1$%9el>pUARC<1;PvYY zh=yqvLE~aia{sf&_6L1G#2{Y9t-hh&)ZSbP_#@rI_ca>nr#BiTSIWD5u_>hv%)rTZ z+6|QZr846;<*Q-T^v)eR69GL4AbWpcxG`(&1AaF*>Pzc^lPohg!@~JD^E$t_F*9{y z(yg>^ffURWJEr|sAdpHUlPHq(=lK3HEw8#P;kBYMhQW~Zh<}3JepZ3VP23JgiIYI! z5(h1c^!Ag4v#ynMuEQ2LE$suskkp8eM~seinRBE1)IJ8FQrY%`%yi<6I@FpgwYwm= z=d*>VQ;?iUKw{k6L~p$eB|norZ!+=INceYciPp`T8N12~&N%@=!(^y4Ko!ChktCS? zc?!qkaxMhKN?V*@!RnTa+kJPffsv}WPR$S@X(^zPy9Qn}E*k+wyd|XCEy53en$l%SAJkf z6YN1du~pwO%kH=M?rcYh#tcQJ=+hb5)Dplk*_ZY<}(beQf@?#Mq}8+!D?NDHVoGl@BPE5Au?FuTPLDY4Oa(I8`X^ zJ%QSdA+;SB#eYJzTu(sP`VvjQrf{B8epzbfnP+zGWTRv&9B(^fHe;~+uvo>o3y7t~ zi~ci#+AqQ|&Imq2%UBL7Q!L;n{u{b}Z%=4;PWOPmSc0fuvl3<~vcPLe(W^k;e?1iT zq2tbiK3(S<6{rd*;I;hm?5ZB&0?3FUaP=y&A1k)Fe`?naa9m;3)Cli0uJg+pg}6ZN>+8t`3d z?P9~2z$_{;<)lv-{*^eB^D!YR0B=V>L=cs4sY$Oy93NNIH2rFC@L@WWXqHZoliTmMYW^V3N_3^Z7{ z>lWMioK#5k#ZRF>+hCHp@RmB>c+93zw(s$c;v%lV+z=WGA;yt#7G8)SAePIOb>z(s zfL&9$zYm!!@l|WsH25}S_Y9M6w6h3e`NRL$NdJ#dgtnT^^~*UTeX`>HrhSza9ph%p ziLwj@;EoodWlEg4DW(?uGBb78S`Bzr2@ypE%vGyBhYz>m&u&-xjU|aM5bK*C=_;9R zQH>@|(;X8z0dA$xzon-b3@v(4!*@|My}Tb73XgN$02^q<-I}CqH(UulQO@TQTb7H) z^~jy7>Jz!n7TncLOID?WdI(iGk3z$Y!p5mregQq8ES3IGbtT9Dp{`_NW?+G$lQy<7 zbuwebXJX)BVE&&+CVcw;iTF%RY%Glbe|4oYwj?Txq@8OkGXnEJQ{^^~+2I_2VgEJ` zkpCVcP(KR@G$wT$n5*mRYP+k+ST>t&_w8wGgGWDa>BW_IQAMP@Qdt>OL`I;rzal<3 zny4x%Dz6`yyx7JfMj4<}3wQv=vR_J#3+W61D=8`}oRNivy=h)}B+HnllcoT;T0Rq8H78@ewzkeXkXFBRZd3J`!t8vsrpg6iFEo`Ey~2NIKJ9M{?k zrrv=bT%4hz5fHim7J;ZG0L~bo9#j)!eItM$^$%2jIc<3fT%4-Xin2nfDUg{uur{_d zemfwbi7M#~sR=E=DSaOf#6AN9+plJ8R5&pIAQZ%V8oL^U0C7bpCucy`Z*p>5M@Y#N zmS0d=LI^QH*)te^b$QJ_SY8nz!_VdEdhKpoH) ze%4BF^3PvR<~SpO*>(OF4fepRUqXO6_4YRQ2L`6j&Q2!vjsWd6{+Sf%7?-DBNam_4 z0uH|{YrweN8Gf!kT@n{(`cUQ((1bBvK%ZCiJUwf$a+15+BEP=gtcU{12E~L6%&0gE zh96q?!`*39hkLtsDl`@e1xS(c-{T*exeYjopGw_c!*rnxD{F9*fVgk#x=<(V0tms2 zhukWHX#01XwHsR+0D1%n$fw>#!xq0XFs5HiinMoE(kR6VNz5pyhJysjiv-_t5Dq?Y zJNxFZ?$=+lLq17UW1t_YhJc6&puU}<4M0X`QaBR?Z(35?8a;qxUDh#hGue07d4B-= zzow_VRjl5wJrVHD~TFQ0-F=5L6II0fLE(or65 z4|-z;ZJ91@nTkkxbz<*!Cv; zNHr%_W@jT318o0Z&H2)?*0;7ie)-b<)*5g0?Y=L5-=eSRQCPy~wMR5ZrZ4Yqe{9lT z8US(F6~Lvq@QauJGMfMN1YO~i0Xw{E{{CD5&^I)EwZbz#nY6(1)1&vjw?acu9Qclh zFh8}L0W_v%MO6g6UHt{I|dI=qwGG=O;q| zfGH7p?4MwE@9g5>v2$>&_cSOHsgL?&^NH;sK%SS#2B7hc=>U*kiknCWpz+8TfeqSE z{Q{#ND6Kg6&p&4C2}V6|nsM%*AnhLvfi;wzf8qXLNd8ZF|L46NsCkIO_p+FU7%2UT zVh5PQ{FiFpqwudZ{u93c1s(m1ZEbxf;IEzU3qq|{TK zxV4g52t_WXvHCjDjx|7x@AY5-dFbajJ5C40k}V~={#IW zpL~Quk_PuM>-dT^Rk`VFzCx|07OE}~@xzYdGrOAtH8Z{-L00u%sDSsHKR#`Mzgj@! zuj*vrMc1l1F{=Ebe5(9bE57{V1FZjUO4h%AaRIzk2LTXGpWa!y-*H(#V`(T2d+8BK zh?9U0uwVP3OR!H>a19tw@NC3Hqo!=cX@!tSo^N=I{rw+wmwcvyzzHElMsNJH*~fm$ zlk+pr@Xb{Sk&AeTAoHh3Pyt@I85`e$fysfV>yNukW6yM}zU%4)!M}y@RdJMjOpbz# zpupGFzZ{uay{iD*KW1=b#1Ly6ha8|`f_2-uiK7!x`@SW|LCS-}6Buu!074Zf2XG&T zz{DY!kM90&VySlYdW9GkXKi_LW0RFiA zOh@Y!aTvaJG8W!vrn=)_@rdjeIwjw9Z-Sf-kadmcMAO7Uh#Zwk{QCiZqQ5X1Kyd*u zx%sw|enRnZ&h$CkhX<=i4f~FcD)B5xx+1!WP7?F}Ry3s3eK5lqzX__6A2{t-+}m>4 zh8QxCGDiT@{@V6CCoP%iExB@PrMDEYk{KtC`&-atYFKvJ*L6H5^x>M~CZZZTZQR>? zBO;kjVKa^j{p$R!hb*|vneZwo<} zK_gY^x!nZ^)d*A(OeS64qZ^@`B3K{eWOq-e01?k`OUKb6KF75J@nmB0w$AeF8ST)< zuKFG#&473h)qlXGDp}gKx%?5un!i9Zph1EuTsIMv6 zYPy=(=is8KUb9akO&UU)mqQPk3JGQvh8MkP$VejBnmz2+FWg4o41saca1Q)8ou*BF*p+N8wE>jamzif1auFxMzed}W95sBPSskd?rPnbf5>`+OVl_%1}o zbJKAwlYbLEg&7%c%3NdTedbHg6t+r}^>MCoHzkclRC6g-X6hMsj~}6Rs!CRX>6fcf zBk3~1d+Xwgkt&7VyF#(U4fG6k*u`Eq;vJK<_&!QcOw1x*m0_47AjSY8!qsIP#HLF` z{s2v=bw1=qqE1@xlH@9YGKB0d{Aoy_+R+dIAA{4Y=~ARCrE<8JffR*UVP0;?q%Zri zfZpcZ+Ezqe3>HVAdCcSLU%O|S-`DtEu~jX8bf$|?-)-}#m`*Yo$XIYq>F{hA_9OT& z053q$zs|C3wYMud9@vH?z#rtNpd%Dkx{S(z-c&B1l6#u|lY;>RFm$NjjBFSb#PDeVx^EL8} zCzZiG^sWpFD)$<@IcoPiodNNW&R9LaHpMqxFg8LF-|DKM(OU!~ufYyHkBl}_I0JAk z#QgHA`-K%cD6{=QAscc(%Ve&xVW>MN zsUX|p*mGwcC=KuCY@y`zCY|bsHL~CnaF5AxBwjve`L3SmTKH5~LZl{SOQ?jMbg?SA zn!K!YR&}Qzyp&bV2!x`qpu~SSx5_#(JEe32Mzi0WZwn!eyjdIId6CN=>j=jjDj?T~ z%gR@);deGj9axfGQHnnPGhj+s<6ZB zYwxtiER{~I?HX=xeh`EDXHm6+*&Ab*X9bp;U-Ku3uUVl?>{AAxzKR{JRBan`!d=lC z>X9Acn&XMyK@hJv(<>26JI4a1fZExTcA^TlvwFg3M_2$7>z3T5fujKeF)bH4^++(j zQgV$!9VY96{O%JjlUT0xG!;2gvmeYbzc$H;{G{?s0yjvX5{?Ff%8bQaRPR)&=iV(4 zt+X2x$foG=bzgO+ar*_Dh=m}B!F0QlsCmm6I64EvQjIzM@>3KjQDPsd zpAZf7%fUGKro&H*-24J#Q>2yxVNeI3Y+qMQL_LjmTZ@8JqtH6kvszwbRpzqD7h}-Y zAbz@HEqgh5W@fZ*8bp+-M-$lc&N4+K6#lAIw3dDVoNdIf4!uNC@Y7!qMwu>bdI@dt zZqD-J396$gol7{4qo$55)6mDY6v5_1s8c$>L+27N0`4XHhz23H5?1N$X#z~?InmfP zY`CNkj?n7^(VsDe-RN0M4N%hcW5Wge`&)x6jQ51!et~A~)qgf3HSZD1U1oC)y(^BE z5HTgg13P5iisMb9MJ3^qHm@1f&&r-ZWZ=}cYaeJOU|apV^eEo@c6@Y?M!#{|bohlo zIXWooO|b$0EP}QfdECH7vjascXVc3`>n=S#chg5o4^WQaXgDh45n@qQ$mwH*3|xVJ z_iXRHlb?5L4mG@|KNy5eieZPf@<1z&^T0EZp&QA%+@#=-)+L-v8|0fr^#(@DeDxi7 z<{SH7|N86b>6_UHN$OKiAQMys84BP z&P2ww=^rtn*E@yN>yKI`AJ0aD%SrgXHBEFSWnxfXdS`QnTqqq1zYC%py6!)vk8z>p zdw~ci<4>ve5Po`_^e}gcIp{xxsT+3`vz@znnR!0~IQ5!hU|xXRm73y73!zH>6^)BP&;#)8i&9C z^NJ$o>C0Av$R7Iyru}<9gP|naYZ1c!_Pj5{Fn7c7kBH?B?l$084SjlAC?lkJ8oYbr zqd6i##-M4K9#zh!5~)12UHY}gUO1~(eI|*L(*v^jhZ}~zQx(^rK5ksL`gG-AfqNf2 z=iij3p1TbqD~jQwaVVAt*UqlN4x31t+MwEeDz~~0n!VN!n4Ezx_R&Ehl)qQop+Jqa zrhtdhzDL6e>PD&A?4-guy|SfpAr8$A0i=vbZX15$`A8MKdo}(sT-T|riE@sJl|zH_ z%fOe@#BfDQW#@?a6-)gN_S4F(le+3%^4qvwt6ZuKXGWn?Yk|UySMG{oS(WR)*6|m8 zZ>&JrjHTmS`rYD~4ycNCQ=ej@=K% zny|-I(u<&@vwpvgl&F@%+tRtultQ-7I3dF8T8)rn*j64rd>A1)$tq1L`{UuK;hVF3 zu^*kw`yS#%7PXxzPiJ%QC7#eGC6&Zae=)!=XP=B(+A3R|>5vXXUxr@6#F+Xfal!3WJl&aNC;N@tR`+sIszPfEQaqr*yw51G zBdq_-*}fdQENJs>0xo;cAS5BN!<56gjJz)mPI2UM7Nr;p8^!_2j};h<6@>75TXN1+ z@Jw~O&H*30I!3WT!MGGD3c7ByBhz#Qh)>M_#0>lCZtg|TRe}0KcOX1G*w{dWr`}K$ zez>%Yj7;+2fMD31u&bZkUYPkqe_gz-8;L#<|KTf1v9__`Oxb9vMDG3hY7U+6L~joY3TAcl#m^=rtDdj!UX*M4+j-& z-?Ug)JY6$5zSLH7sJVH@5r@O=qw%~hVe}p>RX68neWih&0to5(aHQx9Ec@{jUrcg$ z1g#vn?jW~|w;glKnfmw()*N<&%!I<^aeurG1B09w?rmt=5BIY-<`yTOjT#JdQJzAn zwY-Q%-D=VqPR{n;Hy`Z0(6tS}yn}gVwogLD8KvwUuwBo zg{`2apr(3>!^>hE!KkOz1_L{`>`v%@38&T>|CogOl2ci)scmsSi|FG30ZPNX9>2h5 zwu>#g;tD4|MWK1OvNRvlv-F5Z-WNA-zj~;)_p|wIqdMD6zkXUDh52Kdu=$zC^F$7f{ngHm957<~<5D-l`@c ztZoo!*ls>8R#m3aNCrQZTQ&_(@=^tFRt-A{C)N7GR?0SISW%Sml&|i_ep5O&V~x$! zqIyy=TB1z?-u(4S*#cGd9ek~E?}UX1Jlg`gP6u z&WvIkc?wyb^Zw!2Rc(Do zt2O?-l$r{36@O`K48puHs-Zk5k<18})oGsob#FH_lv)vx$*z7rpPIt7vM7#IkELeY zq#NITy$=5q?n(gVY~@vKV&tRC?fuKWO=k+&8IB2@?ZJIA`8;84vEZW9qtMkrsnC&- zZwDMkz7BOha7Ym!hE;O*TL{EmNf@-HMtKVpN(5$ovA(4s;J`Ymu)#W^4&*H3#7H6; zmutRe$Vo!foKJUrAq8L|sZq8tl_>l2=3c%@&6w0_RV=zTa=-N_iei^K)>byMJ3G>S$4oH*9h7@%OpWr#3o@^cLkAY1MkoqsFb4&aYSo_0 zJ4!Ksa4lNHE&Sd)l&DFKNc@`jnBd@$s@b^;M()Wd?SIF&KXxX} z0P2Ui<2s7FYjOHn==X5g-woaHK`kJ|=$x7Y$>TCKOMr|fzeY)GJ6ijUvMfi38cHrp z%0pjz)vvA8!ZUnxRNuXRPNSi7Xe5wRs#To+tMBzu3gJh>3mWhVE%g~E@xq&7j!5Ti zgws;OpG)cZGGN+yfiKc1oqU#p^AZeD!zWCG4#h1=5whZuf}EIRQG6e*LmkJ|Go}>o zU9)tk%!5!G{3zlYxwq@I{nChX7gxV3o^5zT$IXoq0 zS22&!ET;!@3qUWPqbNz_(2(eB#o$6e%rRg>|Ye#IFr`j4q;Jr*{ImRc{WyG$KMh9Wl~9ywAmw(Ob?PEKB%Q3+vmfAX^sj3hJyT0eE(TRNqy z7$FIvY^N~fzbO}7_uJK3mmqnK!%hf z_#$pQMD+Ky+cGJpULK(r?%)pioY5g4QfzUd*`LT43Sa_C^`lx#&j<+;NGwnaNh3cOgXrhud650YwZlDg7uG&S^Iu3LfTH3)Zh<~pS_*^w5lar|szsD}~P!5xEY@E76 za-b%)4d+7Sq%@&w#eKV*(aod6NVs3nzv9_9WJ-Bd>TZKjmIlO09_$qxky%UFtDd~; zUuAT5GSngn)@J9af-8|5K0bYtO5%Qf`aV8xLm2@SxKB-{`<7=Ck7OlTjPmNj)5>J%k<_a@x)##7ButF?0_76 z(E4ats3CV8Wob!pp zxN58`%p=xV5r|G{;7-w3@wV4=v?74pG)8T6{gw9ay`ir-&R3asMT4m7XLnrjv#%@1=jsTcQs~H$u%uH3@KTf6}K7K zMCQalZqgPnQJ@q#PVnb(5}Ra2o?IgQhi`A1Cf zzQ}P>!Gs+n>|{^!?!*u8fayt)ygo&1rMB6BbSJsL-|`;|*V3e}lITWHs^f4}l44M1 z_@!?3%iEZ;xjVl|H!E0Vo_j`}J!1Nk`uGq@3gsofriu~wRBqsxB_Dp=WDJ|n#N#p6 zIInAlKB3R6ivjJh7u0pbsg*>?6zH*Q9z6wYyHEqqKJCqFE(#FdCqx5ak0+I!{DfLv zyHSmNS&6E{DWaMJ?GXbu?@}@c^5u>6cMT=&Rye45m8>nkk=6TeZnDtduMR`29+H}6 zq%1f}n&b+5Vqhj50~SigIRvi8mhI>ra!fOqq^RG!UOgqpS zQ$U)5d~Q@B>?so0z3c3;7pOQBIIqrt2d(R#U}_H3Z##6RiNdUnj~`vzFW_2Dfz)dG zwCxyYI09IO#FqX7{Ig;#?Jiej@}VJ^aR*|TVB0D7)a>u>ZJas1L%(=Y=dJgU@3&t~ z(dvCGzWB<`{*@NADs$(QjO1plg7l(V2m2~d9YNhlwFQy0R3%1b96fd?UCydx7y(J{ zy#LKtP*>soHno;4^wCJ{o0ahQ{eUIuvAOtYi@?_hizPw?-m0RXgVmw0@E3>Aj9=wm zUh@<$;&gJy!)@5|<20B|b8PJPWA@#%4f9IyQ0*Z)q;DQeca~d+ zR@B$Cp*CR#d$_(+jNw5lY5~d?GT5v|`&Tsnu&iLT>K2xw2`k6o4~piOq}`RJU+>v` z%(TD_c)^0E+K1ih-DH}&85EXla`h%mMR{MLQzTgg>^FE3nfAdgtJO;0C7n$7Go2cv z&!XF^9WBBOLLn&WzL~$O$)1JuR+kesIgDILi<1aP+&mre4N_M>s&{} z18QILO3R{_gc2zwoAQPeBc@`GEa9Ir`=ng#4I^iQVBRN*49dgJUMy+P`kouS)ks;i zC589)vwV1Yyi@x!CsHJw3BL>LmFPDHBlp#SCz_8+`^%i)K({L39|ZC4d(8?>Wfih) zvR|7^H^`eAy;~4kJ_F8XIui;XmZ%6XC*ihl)n1a~;RMZVR=P(2z*#={fq5M%uh54R z+RIC_B{$^BY7x5}b(m(eUj7p3Ty1Li>v@?rK&QzYDx>4@rcpIlL@iB1`PU*>AZO z8MdNAqllbEyU08~q*-m#U3kOwSdJNoTaR* z5?JZEJ8arxK8J^X5ZZqi_qfmbE?U%R7nllT?BCbNKZuRa6bL@#=qxyb32QK*PY1?H zkI1+NSKVwao~4&9P*7vgeLX~-3YLbo_Kf_VTtl3@nY5@oe#1r16WNAfxz$R03*f6& zw=>(8(kbNv6QV83YO```3LZta;0woWB1?LTCQK(+tN;2ob@4VA>VR8!L~HFFwS{A+ zNt&hJwCb#ehihmsFjYot923TQS!_K4k!+RtRD)L(x%@Q_B#uu2%k8ZSr$jLuC7PYB4 zC-q;t|M&!NlsNgqbTH}y6HqEj%!k~N@ezUZhB@@>P3mHiX#)q-Lmvu%e_cdzsF)d= za4*GJX;_HrD$APRDo$WyvdWPc)OT4>Hgg7D62kOyC;xyW6#%1?k~EN;Ujc{8uDLfd zE@{y91~nmq-s^Bn;psEhN^A%)lBA(PS|Y~%<`GA$QOAS0kx{3onMNGmbZl2yuEq2% z+e67JG!LQ@M^_@Ix`bwG@Iim87R%d{)>XG#xA*hQCCx~q^{Y3e?_)&h#!j|+Oeoiv z5i0uffq2@qY%dI6|5~QcLd|oCx>wNIsGa&iF_9A)8_MT2AMI9rHM{fUOfB3mrc%)H zW;5})FdzQ~=8&}SxDw9G=={L3(ClFh3Kp(1=x+!Qk}o2^s7osOE*#!v?SJ6>>fUx! zcJ~R2uu0sxG-zhBv9uxsLtMN2Ef6}TO~~xE@xo=lDP63R2SzAvugk||cs7Fo#ryXG zXTXl`w$fsFMHIR5&jVD9VoWitQTAhBi!Vc`N}$nY3En`@g~u!lVjE4CV+OFuAT6m0 zJ(^EIH7QcMbD8<|pQXGg50x-|xlJsN@YP)4p8ckluEu3Rpfr+BMwu^FM6?Gn`}f#YcZORgU95$r8Zv^S7q1RuiU#JAiR^ssUK!o3t2T+tvxc=n z+z{uHiTI<*jBsfpB|qQb0$vRb^pUiBi6% zH^RfSZx4?ba`}=?5E|<%{SnhiK+f@6h&){qM#{2g^jVP&;Fe_xPhu@Dt>m)PyYknL zY?}4Yv*haNu^851!ymg|Z1a2g2tsN|Sp0btN;+dMHJ+?hf?lx6<&{{5xLbiBkwUg* z)@OT?g1H}4yyd2HEg0E~;e8z)@`WdKDD-1Q|CO5Bc5 z!{?bFx#XD~2US7qPH!`SE}UALd*&QWM)fOk6tef{?N{QZKj)Q8Mu*SZc8gycVlB8e zEzDpu$bA~e6Abl>_*xXy+GW}`eZkyW?V?i(J`Gyq&80)?@%++Ut8_viL^KO{LrB$3xCu>YdMrc=%>8Oe@tvQjX2(gyq}jpFHlRlT@nF zI`+u&BjwP#tXM+gH{@MUpbYe*T7Ee)_T!QIo6o`s&Qr!Ga zq7(T`Yi{qQPq=DhWVf?1qEORbeDwiUJefQ>Zzz$+Sq1Ie7JnSX;P}(GUsvK?8(a1Y?J3##IaUYEpRnS%JGo>%4}somJ{X-o-T#Y z8zX4W^gUBsq`QmTg~A)8Yf9oQOu{lZNfq3ZxMR0J)1RoJjJSG?wkRrQ^l>$wFc_Gx zkc9~{!ee!8nttW~%6CPeoxam>HbH<=y7wjVeW%cC4b}boPkYhH@7tTcNiv@9_qiy1 zRDshv%BpvhR}K}v-WFS>?3clKNr{-wgYZ6)m70hbz)fNCSiRm~;J-lRBBM&PJRjN+ zUoCjCEvJw8ITCJ;d*-wO6u3mjIF!S-;eN6~7K1x{Gljxiw7T-eNa^r~+)tD%luoa( zh%Qvp340zk=TOj?e^(S-32pdI1W9C+8ljP@DJ{$Zii&MAQS3dqy_(SgdUTnI3uZf{ z=)5mETTyS~}skM}rEZAl_kT?Miq!yX=o#iuk;)XLY<_NyMNpR*3&MvMoClx!W3%S_m z;Kctx?!obpb5bGNJfw@UzP(OW`$FWZ6x1A?#*pxO;KVl!Y4)W;gjbu_E0a>SaCe_N z*Ae1k)HVjYA=OANa5diwPPKP1DuV cszf9}%Jtfp+Vlt!gnFr15AdKf2YM#A6l_9ke;2dmxc<`dLBLc%)MGR!=bUkO2^YbLlS`pmQDxNpZd`$JXYx^%cICe&bBmo*5xii#+?OhWo}Yzh`B} zSk0K?5VkBmD(Epau&7oeg6})L^k86Bl2;;n2o8qm4~?J#@3$X5wK$8zzCCL;yAJ$f z21T#R(D~zQZOnu-Pwn@}bkEe)6)WO%Gp)SB&f4!+MNV$$2Zkw^&{l5rh9R(75shxJCKTK-ME7*6I}p9x-a#Z7FSYy3FD zCmH63KFrK>d+6113F+#A-j|t0b&j=?IIdrJ4|cKef*mlVk3%wCl2?I&J%R-`!xxkN zqD?n}Wg9=yB{;R=@vZ~yXKpO)6ce;cJg8k!k47EXkZ=|;Kq@@@Ms3S^Z+jedlk?^i z(=ieV&H=s5C}~f-5w59z2P2g<42SEbu!j*jM0*bL3vWMwoBH^&4cIF_YYQVUUAQ5P z9;#LbmnRYRX=`s8N_!IB9tlC7S%;Ee)jLcran0-Y5%w^Niy9o?#aRhV{xX~ zFAU82SAU#MLd_!76&!o;r*=Y*N_-Wzw_SNfAB#M<-dDK_&&D<2D&n4@Pc-^}1mYXQ~XcKmwu zjJ2`S!IFkpiTzeA5i(zxL*;kYDA~zcGWZNE-QV+$vbTzGMFvNSC5prXwj$T(hu>)p7 zJ$r4{^)Hv@QE;klZzKJuf0fx1y{#@t+e9}BC{aERHzr3J1kS=GTl`SC;CL;aE~U!d z5{Srlm^_^xxA|xb6FrF}J~UawFsF5aOfG$*iPKM17T5^|2lYltxM^mu_2uWxL^-5t zbX%USQ<5*y^dYN4ptb?86>7~O4<_7&01OF^Z_Aois`s{=Jq=&UvoddEXJj9H zbAVEWPL~W?ng->zCCHA z3x0k5C`n}?Sx~PD^oRmGs=1hVYn$#%u~k746|< z5c#B-Ya*?a&L~*6m{C>4CnCKIm={n))zn0fcrtZUr^LWjFwNo3&0f~>sR?^Xh~Y=> zuU+6(1{F9*p8h;Q=r9>R9+**j$oei*Atu?j<-f{bLouh}`id{^-Lkex9lKI*a+CBL zdSX8f4BbZdZige4_0o?aS`Puc?Q;rm26da9Y&p=bHAXFk3yQ=)DJA*dQq3THVADn zq7W0?8U7kMt7|it*GOknLWk7L>}_5MJ6LzY#;(iPU+xBh}f?VPe+_^UrbZ%ZKa#OJac647iC)3 zlgx$!qXJ!yC!oI^y!J6u7O#9ZDw5CLhoeltn@$Y0YcJSDrRGOlvdJ6nok? zmbg(XIC951>V5IfEFwj7WD4tROHamC+L?-O7_hB{BNcRAm!x_W4lG@D?^f)TK46a$u`SoNRJ=5%ESKrz;8jH!A>Q0U!_+KesBnj&BqpBuT_dm~SP@eYMz{eaXop9vY3ynVQ4|E*OU}@ab`X=TS`)W{JAm3x$V&N>yf!JV6aT zE?)V3lt(pY(i|7LR3TxyMc==Ud{5L`bV;3)yGFoMJmkwO$|?r~-35aw#MWO2=~a5> z!oK9ihciQjEFSqmTwK>R{HPWOK~8S1o14X#Z3HmLC-21laqHq4G!H3XsP)0f4C`Vb zU%E?16C66QXBn`0Hbl$cL{T-pjqE0SW6w#b{sChKkLy?KYT2Meu5PNEfnyS~x+9Zm zk~d*cq&TYahc{>j-55Nioh(_6A;TyWF{JGam3Xs-ICl(ga6yeTtcgx9Q-#rXY$e$* zb{Y~{D+;0N)NY5V{hhDa=ZN=vY4JYCyTqGum)b}5^e%?wgLr+xCf*IL>+^2PqH@H89A zTJdzw`Jn#f#9oY!aCXitwr)#MFNIIPvN-G1%)E97q7g ze99eCwC()fF;E9`1+}P7xyc;s5iQg!cr)JuqpHc{zBtaT1qyM75lY~4_Vr}n)F08n zem>JTY+Kzedswv(;Xl2Ok=xEYaEb%g}CR_akg95&q&q3351yXHlHac@sfqkdc zvX53fU48>l`D*2Y8`Dlb4xu;Tu!-{2scniNOG$#5VP(5Z@r~UJ!Ic(aQ=2I%1<{>A zEwvA3ZPb{|>RDd%v1Giyj{Ac7w>&qAvJ9JCm#%djMz|lMQ7(Jp&&-UI5lNDLIK%}$OIm+tm@#~E zb>31|A#IW)c99Fr+jh>V4UoaR4IcPlZ7S2(;<#%0H63RB{_(X83uP2feTCd<#-jZq zs;fcAHgb&Us4)*;odUUJnX*R?Z~7=_+`JNw-o_j&?I}xlpklmLS>{_#Q&#M|{wmCt zj`iGbFY-h8x*1Z&sPy~#Bo2>O>x8S6H)9zIpI`P?!0fzjpdG$Y=^ZHptoS+m?oX(H ze|<5VE?AH9mLR-b*cwmbXoG3saUYHqoi&<{O!}S9g2FQ(xOBpok;d$F0D zV_W3HRuGpV5xeethX&Ti*ipu~<1uUm5Q_cowJrNuEP;daTdxf;SI(evq6Xg0Wxe54 z{M{=rVdfq(acFuruKZ84m*Mt>sHU`Wp)%WVXGPxbT4@*W!tZ5<{(@c8}d_rRF#6T2&S3{D<7DM$N|dq_OJu` zycKwqyd0yqBf}g&9S@{A#THa$ClXjTKc~VZW0@9iBz_r1rrN@wS=kK!xJ#-8eT_y* zKYqtW*JkP(g^Ajn>xLgQ?%wLg3`8%vB9t==eEq>uTo5`i(!71=q?I?EATHhYOhsDu zM6*};D1UZEcs#EB<%~6#t;zVi>B9iB;(=`VF)XyXi2VNLe8kru+!=M$-*k=`tPugRnx03?Y$z%` z+)^Yz8Z(kvep0{HmZH^r*zF}uZ&j+gQ^^}$E4`f>81DCvmLLiB`pavR*y8- zp^y^!(KhQcB}VhFKjHvP{fZB<;uoG(&_j?CF`np2yfw}sRR6(R7bAB|XH^D8hII$Xo z&izm`d7<`>^|XRIiQssqNowKXblkR(Rm|Co&8PbK1}R7^qpsP*@AH=NY9l`4Gw;`- zwg3}rLi;De<)9PFxo{%W=y_>Qu%AjLb5VUOYHnzco!zs+4n6)1b=Z*j+tHUfDS31THZ(T{5R_k4) zzpcF6itc1yC+{<6l+swNiH%LBG>i*X@+2>^K_U1+^ca8DMOn@>x7xR9RU}kmaeVSF zEF49)JKNv-9Y~LPIn4fGA~`RYpo^Szsdl*2mKRNu9U$oG}m{ES(zF@NSwa7tM@?wNd1 zrK5SdWR>UbE>P6P`8j?p#p|+(Ip~K#0#6hdpjn89ZYdh=aGOA2Emy^%$ z2D#wAd#k5l^8V!K)xl_VJ5jpwPn3u;EH40!o}XTx>QsYpUFP7Wc8B+xKiZv96vhQy zZ=YCkkOtdcx`eu#eCgh|kMfAS{J1)awmMeGEKQA3tvj8x$mCQTsj#W!fkTC;u&5q# zZa%3xt`<%Oy-~Bm1}`lx-RYRwS^Y@fpJL|C%&;6C%IL* zPEE9w*S5l8=iWT zLM++uE_*u$ORO(n@_No@>C?tCp?Lr$LXnD4B`g~iTT4^NVKS%14MD?NPc`VO-L*J) z=>(_2GHgBX!r>^pQ8Mpp$2}!i)p(5eGxx7JD3{iYA1>^w^LVL7#`t@8CKw<2UoENj z03d%{gm=o`RKXgojpvsPDt^(#@+m(PVev{sQai=1p7*4AdlRhK@ivsmx;_Kz(;hwu zdV<>}^?pOV`$jv5s!i~yc({U%%PN3gun+5Jp!!eIRA&W0O|%lkrV(EW_yg)wUrB2W^Sqa8YbzO`y8oCLkWuZ-(J&jL&EfG^fjog!oSvw*810 zD%hnuSTXL`^|P>6Zef@qxr{qq^Jodu9wM<&fl~lTFIFNG(73yc5tOzabP8Ugk){b^ zz-1WW5tZX-#pPb^Z@-869u43dXxE4~k23bi9HS&HhnL`;Cq#bqDTKjY#rdw_?pO#o z5$uTCm-~zlH2^!(94hrf_W05yFw|WNu|nhnDrVFTCR9cUiPQVi_n1279UFqUgG_5e$kIQ>< zryacvLEO*A_vBA0E5VDr(0ivqLtxdJ^D=J-Zf7d$YM=T9Q3A>$0i*HlZCJdiuu#)fU#;{j2-fZnVhL^7J3Pp5wo2}xj@zWfh6+E*cKo;vNbV7a~dr@S`JCU zd)D~qZIn2gBhe9yr$x2`ObR%pW#Kd5?7LE@RjcKp4Q(yA3n$AyH77~&pW6p+-3ScR zz@^|DC8IffDJ`o9z5mzVUE&-bE?jcurXlBn!!3~L)I;uB;`rs_srfBH1 zc8#R@`w!Oqa88lkg@Q)AB8>dZsckqRA+_jK<1OX|cu3k6)!vzU)aSM0G<*jDg!W&$ zyO;@U9Qs{_imm}vwo*%?Tf9`StE3P`J0;`W5=5@P-DWrWgf6!$l={}OWiQeeGxXm! zv-(^iqoGXb3ArA_vwy*7m!UULp22oFRHreBsd7~&<|_t7I%_o_G{jkFvkFKq!0~S# zBwDHAM;h=8K9J=qop2oQ+FKR23G|w3YjorqgBkL?2ipxZXin+if|}cu-&?dF$~Pkd zyoIK<@%bbD@xSMp@AS)ChHT}2i*U$HsKp{$*A*c8sKWC!Ux>9|UrQOAYh!ti+Uj1d zkxId~;njU>vaN^2LMmY(82G@?i;o#gxnoNjH1Q}P+ORd)dpU)~ky56Jh!bTwV>!sh&dfg5SCVp0q_=hUZo;e=-15CrtubS(?&goNB&Trat$wrCxv-k6dD zovj&>lv^6~TtV6OUG>BRRsoi`8w*QVIC@EZw1Uj^`v}o2PfX*YX`JtT~ao$Sd zEAWR&^FC6N53%i!>BL7RKV)RVbVhK)gkA1HDZuIHV17wfky=S2)}#QU>MUoMd~ zmQ8Qwf>qB+hknV#v#N|Fd1!ofFGx*L7t0Nv(~MY2JdSdb9cYt2C7y&{z~X2)q8UYB z2B^UQ+(noL!IOVqM(v7dx#WH!II0$42;G1pZwcps(Soqj9n`_Ic(vm_RbUul?jt>v z*AtzRR-0 zYtuNgM}d{fmQ_zaORa3YQ^jP;6qM(T`)s(5iN=ue8OPga7k3n?yWeqnF$1sEU7!)8 zRqr*-f;Ou;ZNVM1=aMqFw0!WgMBt>#ug^HYF0b~WwdRv;pxzqwUW$Jtg%hw(y^O==se6vnZ?8H7LF`?fn_N}m~MLtl>n#gy6#UV`ZL(jV$LByh` z<^3(+Gn~kIC7n9wSTyP*cb(fG*<>EEH{JE{j6_q$IWTdT&|4$*{PJ#a?}V);4mJ}(g7-h0wYm4qY zL*^HuJzp9MjV0G2hldbvBd8sK>_^LzUY_Q1UxS~6`-lz-kfW*bcx{V_I3T05s|osC zb@y1bjlQ$|&fc|?>b1l2C!JteaTEQ61uymG{|7EW(Z9XUL&FuCx8Zn0gexm~x_`}B z_t>ipWfTXcfdYAnN!FZ8>5ILc5YoKAb4J`QXjlW>!gYF<~q-C~luVzA0JFER~66|C!PChlE@|uZ8gW zKVMdR?K%_JywYrlB+An!iH-*#Zs)^>ZLcY-V^Pw~f22S}&mI(@CRQKDBsk?C=1SdW zPy+sRuq!pT~7qXEB&t)(~pj}phmmQ3SWKttQaC!OagR{31mxvS&2%W?wk@ zmS8cwLw=-V)~wUzQn#OH9JwAU>Zf+!OV-ym`3awk3ki4iOeRb@s*ICPDv~C z=_&|SO3@BJtQ}F%d*_quHZF@6Pxp1O7qYgXHO*)tbmq$f9m2k0*h8g0KygZybt2g> z`;7+8DdA%ZcTnCFN{Wq1d5>cvPud-KN-!9_KT?<@#Z z4Up>;3AVoQINVM}X-@`#>uq98mReS4y zKEXYs2ABH<%!K=ITdHmncI(~*8_N$8PRnGma#=6OhyW2J!tRSdf9-Dz< zvNS+Ndx&Efr?MNM#&!CkUS|F`fg_Ym5?Lyzj8UZvKg~HYBpGFCNEmWbqbb_a^)H4Y z+ykX_eEgbFgs#u_Dnx4qO34AE zXA90T2?N!j5$Whb@~DgFW2$tzyc|8+dsMz_C!Ec@nXA`eCI$&h43Sp-^s;UG;;NN> zV=q{G1m3(>o>LaI-O(4W)%{yv#0BM0PEeI9fO|szdGU(5a(h)I_396*Od=?kVaZ1B z96w{6bRmKJHaMl_2bRJT66S_i1#cv$5tKrBSabc6Ju~;jL2uvlU5P3C7T;C$$fu`> z8j>%U%XxAFMrS+oyiv9oQX$@EX(@t(V{>`L#2SsLTPj zfsFc{SKfj4*l)plFxex1+v@`nT)I`h?!55>1M8vz?;hH8cipA>pYt(OYoRysj8tGd zL$e5R8;GNwf{@m$D6r-8qdGDj|1XZwF;iok!B{gF6vflGFv4m5y*YCkqZ_0W1Ht~rcLtX&JcBK{;}!P`%!$7zj> z^EB2vbgSG64C2LNG5FWrBmdp)`+gmf%0Z#0M-;|=+y`0Gv??wh4qXTE-6W`zawo? zEQKx;Sx)09OXj*cMPtcOOluyP&u~S6|aaTHD>N;f&5m>x8aJv;{&2uR$iFKe^VE zV0icWBj2Ua9laWN!JM1hL?%qBhu>r|2x*_c?Cla;q%pXD?oJEY+zg;st8dG)HyF&( zGnYEF0B%5$zaS2z=>{@#UrsTB)EQHbDYwLu88K+ROQ(N{+NP4KGa z-G!TFPq|xfJri!8h^QLb#{rRWtN2Q zV8#&{hfndC>%+rdG%5jT*3IY`>-dLdVE=w|Bx8+?#X5}fjaE{VGmC}8=D0VUz zCnsN929D0_10ss4{af>2E*EO%0P>Scmv84{xCwjQ%Vy?B`jv>OLiG8zAR}x{b!*M| z(wvt}S{T}k-}qbuoxtFdS235*u($h}4}Up2VztePK~CC!V-^_njblF55jXySWgjXW zIt7Z*wG1t(uk%$zs|feQ4=hBJ8_EzuMwB6Me-}srQDao0Bt=--oUy0mfSpUm zn7v|$z}d9vcjw8T&0F;mA|@k^t6w7T@nyf}z8Oum9_yxs#P)T1Vwkqg=)o|Rhz zu!Xf58W15AKgBN*#fnXob((w(#UmxhTgiTK&%K{BOg+}XCTaB-*F}!1iG^}SRW!|x z@NPCObDC4ZH?K^21`7SJp$)3I?Rw`WWW?JIOp#pKH~798?{W02%G5>T+q{SHZjJ%o zXv@JQ1fHP-&5zlmCy6Am|7c$`j;spmUvmqv;NLo;g4y0?WS=Q2-&DF8kjqds75<#d3s@?j(_CVw zU(|J(bZtHknpK~!euQzomzY$;?uPsQDtKBsfRfrjv_e+Ov@qQS7P2R{twBJ~gq8Yy z?Ag0@a<@a9UJjqAI!Ei#9e4%CMKPyH{GIJN#H38KHw9pF%NZ-e;gzQE#@{n?AA?q@ ziaI@mE`6f;q@ek(%R9a2op3S;{}W-jbyOK66uG|3uvCZ0jj(Ppy)&IoVy95zgsRJJ9x(|#nrO}RfFe#?X87$zEM<&ijo@&@pkE1bknnfanMqC^UGgd zE@}U7&I#>KsP|TDCa z#;PY~3k?#~iAn&ie@tK9)d1u?+_=UBe0fUEMl?DkjQW@gz6V=u>?7mjKf7S>aUUm@Nb$#=0H;fis|+IHo>hYy2gblKyG;a!M#C@z!gEYNQ=t9+d1VTU1 z+d4z*0`W_?a@JBJez=Y&nUZ4+A37aDOqut?Xc$0~>;lh&2&<1?90#mhV^tMtr#fI) z$;>wJ>Hj+}mx+OCIQb@2*@KKmK4rQ(lEQCG9jm;+?{>|xIv8!ldOKKo%fTbFT>!)4^^m1OM<)G=y>8dqpf{Z zp!n3E`@ZTb2-+Y*oBv_isFT_OcgnYWv4izRfdwmJ-vA`Lq6+_#jjl&IaCI_%?Qxaf z>Fhq6hZ)gx^!uT0?j7@SsEOciPkP;|9vn-0ku+UN9rm^Yn*dtxnEUxKQ+Z{|@D1(g)RAL1LWY6A zS5deC2!Q5_0Fd=`lifqHB&M6;|MdN825L?7UyJ$%F1*0n_2)xDxI5q_?iBO=k9W|j z@s-!_KIe2@WMKJ5BCJtvop*g~WjJ82m-hpA*#`wyP`IBh;19cuM$Ly?v;RteZox)6 zR&1`AI0KQ_K$hFD$56Q8{^$OA;0stZd^z89{gjd*qm0WRvvSi3otX2Zpu|E8`|Epb zcsVMdVy7~@f1TAj6Y;aA^!MI)YT}7{3=NSvcOh#&LyYuY`B!(-8VCT1KFb<6f0(wF z%nA)L{{m3g6FHFt36gcN=*al{jibAZ+1II@u>}#$_IvG(6&S{VBy{b_3+|!(ML9j& z_x4*5*Xd7W^3Y2)S!Gyw&kp+8{a4~&nGIe41)%}j^S_~j$Rg|iLoXzZaBTCUGMO|u zY`eJ#Aw)W;8rHmv)Y&bp;HR_(hjQg7jlm&NgI1rFcjhVc2c}CXYyv=&Ffn^i$T0Om zQAVK`0X(3Y-nSZ`{ZSQ3#vh*JYGdNRV&?G}{4|;I2)Y=Q@=ld#^zqf?JyN9*5^&L4 zrdbW7>Hq!WJDU64g2T)@2}~w~5}c7L&9r*#&X*#6pmJLDAYzMgfV+WZEr? z!(Gt|hlM_l!)Tlr%p1W3SjuceIN51a9Aad|C^=1*pz*&nlM9>1U0ZtOt>cDKzR)MvRW=*?E)E3!^!_r$Sb+wIhOa zR(yY+zgX&nNF*r!HzoTSBIx40PWU&+vQo0K6>}+B;s0!$sgvJ6d~>h}&tD}LV73w3 z(nvP5>KL)&)uAh zGhPB(8H9`~s~c!P=KitUO#@A}phvjXbas)5z+#a+ay3>5G-bmHfguTELQR{%klHIE zr4O&v(j)(x1=Voyb#d{(KPk=dChQ^6!nLTqotRh|JHZB&anQ<5$Eq^4f^a;_y-$4P zwoN0p)ys3d2bDTaatp!38&XUYM3WYzHC34hi{^s6Ig)8-BuS;X=>0!!b(*@o5}ykF z&;;Li>CX?L;G6N8oj-Lr#>{V;kR+5pJ(C(W?rH*hCv?e)g=LvP`34gW@(&!xw%42C zH~u$WHOZdU#;5$&CSu}fp^Z(U$;eqf>2R{hgZe2qb|>vR)J1MOXTMvtnIQK5W+2v@ zRVKmXxbW$K-k%s10DS6EVV#6GTX36M_ZaTkG$nK`m&^|%`^b-s)a0x+TMDZZR_p5x zn_a6MeU<`&nBUh(jhDv5MU{h*Serv0kknTZ2I8)As&UrUOO|Wm$_GKa>99Ap>fCjY zy^NeVK{#`-F=?jX%AjrUtfE%ppv)PLVDmUprt=EoxIUo0seXO2zS=qU*#!M9?;<=2 zt|rCUkRyy@nvn<*;59#61t9uTXh82%XOwR}_Iwbub9bqpzE!K_Z`}I!&E}RNFzMoL;+m_^7Zq`*&fei0Ve5nm%y7#fDT6sj*Xu$@t^=u-h~ykZtP zZL<0!5uj_Q8*vQZhTKa0^qP@jZe0<3y;-JK3blEVGF_AHvmhVJ3^fg@HfdRYbruOR zEWpXzKsxls$(?*ZKdoHIoy)VUty@%VB`lu?y0aU6WPjNR2Si4(wNpsp;?B4y$3Zji ziOft5bG2VymKLd$^~pIHZ!xnVXsGxoYM0=<9B2$TE`4$Y!J3<@(8WxT?#a__oQiX^ zh8xAXVA@`JCXjK0tW09op~5o!F5*ILJV$j)k1U?X3Ds#qK=lH9o0jLLZ|v`hGGgPx z6PmV9`Wd$b1%WnF`@S>#<-C$gF6F2Y*7^63MCK?+7oteKM`owO;2#xG@>rkdizyeH zK9{5Lvsyps-&-L{tfLj`Abo{qcqQfC%gzoN8g>W1MC_O=CKJsmYP>5tQ+>PyE<2+w zUxW4i{D&0se9O{L5>n9z5xY#e2I~I2p9EWWL7jIfAGr@C?CQH~OEx{A z9T{Jm(J|T$X78PtP|wKf0*HDhFG9(aIqvSLn`J672}-1=O>V9@ibf(wnZUOYSZzK% z-zcSqO;&GQQy^C4)6`XbCj&P(p<=N^Shzkx9Y>Jb4z-$*)pAQ9vkDvIR#!YNM7&Uw zJpuHD9RmYWnT^b72+M6s^O$#<#P?GWI~BI`5d_Er`NqV(1Lx3avWk&1_qZ@-pN25| zRdD%`YS)_%g~GxpTV0XePz7QBsa4>ZJjxxbjB5ZVXy~N{O2FRgFC6mq8dh3`7YQ4y zkc?_-fJsjRr%pGWHT0!gBp-~$+u{EZ8VX4%VZ67yE&-94oV&qJ*SvAoX_`->YlMTE zfTP4fIq2VwvTL)OE(l00qF`xU8U1uyc>>1SP=Tedk1b@4rj91;aI>3;g(8fE0m=4u zdD3kN0hJ--a?IN0t~f+v;p53RplV>BNCJ}w*d(9ot8(_?$k+4xJaZ4Ew<8oQuyi1B z(piQ%XhAaO$#$IzuW*cl6g^ATETR4D*xc=7*o3;c$Nb_OtH8-WvkzzmvD z3st2b>3Pvl4ozdf7=4P9{{Kh;N%^)ep`ko1XyH&a@ydZ+YC~^X2O;eVGEz_y{%>}a z0Osqm@eCt{4Zg%gc{S0PnPhPOYbMp()|H~OYA+LXG!|z2F-e9*Cm1TvMObCZ1NT@> zJ{WzO{V>NzcrmigUg|evs$1eEaj6w2Bj?6Bp_os49L7~`It9@14ow4fZMbjbe1vY4 z!cj_)RuFxr^?>#)9&LpG=av{}f zdT`a6w>+jmremj-ATaE!1y@QtM*^{Xh4`y4GP}$6ACOl^J=XhQ-eYJO=X~{ft}dLZ_%|5l+p(hI$L%aF?GNZ86h3Cj{ELX6gf42 zD7&^OpPt6rG{iEWk9`(0B-g>XcMw2=EO%#%7KOopd7RS!fL<5VjCS?3!qBbOSl0yh zOj4(R1HK2#QnoT5e@CXu8}*D0xXQ9uXJoBQdYz@OM=&Os4U7DMXU-t)u^CP0?y46NSytHhBhYpKo17%W+CqM=OFtsBIgHI-Hbt}|m z%F=tDvH}c{j*;ja2dOI6MA8A#9bW29S^11h1N(PqS_;%A+>u9+bqGI47$YZ^UzbwG zPMtstwN}F2QT{5N`PU0DJ}qDn_(}dw7p9*A=d{M0s^tE`YoL$_C83Hv$o0;Ia=`Yi zEvG4XRpm3ES2=jE+J_A>@V;Ky{0z?)8gz7GN;kBOZLhg6!SWhT$B9lV4RT216S5Lf zv)h8^=G&_jQEDtq#(nO2xxq*LZYC$kRJWf-0p1&Lz}DM#lA{lLiP_fh@xxZ- zu0bAtpc)Uv(8$(eo5exbVQy{y>5mL58|>EdF0M@=nUN9*vRL8q+FORm(s%e1O#wE_ zEIlJ?0MtC{+R0%mEeix#lE#JD)?#*V^w0wsc?3fujaZSx!!Ehlfrr;MB*Nw&Qtf|h zI$@!Upy+CMPRe6vA`Sy?)gU~>cb#)TQy=zWn6SI$bOQcFb2lCC7ypj<7J9O(2v>Ns z0-dvAB)iOB8b6)w=g6NgkcOWd^=(8JmaG~4I=0tj7@LVlC6k5o6qT|DA74x3x5;J{ zaSGumLyG^f+wakz^<54t;shVczw5mEKY-t4d~0P0iP98<8Wbv(gb&5zzMu~LlTE)M z%Ae&RT5PDw6C3VOy>ZpgsO#pApU0d3fesCVx$f#+3@0NP{Gy@SqGX-xH)2IPvu(0o5js}Qu9e(=Zh*W|sIhkh8LO-QwPt->miXXSl9a4#kG=GVO^*5s7_ z;?8@#yMI{HG8i5skY(d57p}7=R00R&r7Lw@By7)p7U7SXhA>E3)vtuZ*0*7O$lQ?Q zIqSlw?lbt!!H8r%HgBroO`R*^vLzr^kgHpr;7`p~mM|fn+6B2w@SCJbS=V8E(H1z1N)saj~x z+7z6q0C^X!$CHU@@O~Ec`AbJp3K;a4{Xr+ntr4eb5`0754b$DDya(4TA1cy1n&m|A zJ~0+F&v?{1*;@?=YC=h?#kF!6>l$j!v+n?V_?F?TNxP6H7&KX?&M^io!#eV@YxaMZ zhm*Qj1b~DZGDLo6&%6d{CY$*N6wj{Wy=%vQK9WkT|TPSJQwu4 zA=_9Kjv!>k1mGS4w%HEnYJ8b|Ioxtb8+bA6$gQ(_2_?h2cE$(tj$9N=S>?4rF#vCe z-9qyh6`KMS>nT#ZkI^_L_goZ+0mb4h@vic}?#3imEWw;}nfV0>^~r7k^Emr)=d0%L z>ndS#%dq=U6D4Nf5zQ~7sx0?_+S}6pe90x>t#bN?x5uKhD}``d|GY=%ze9w@OiaVj zl};|u%{C(^Cnbr-_8pO@oGoDki>IQrk=Ar5viX6(r4u>6N(G5kfHA{2N<=Ob|{54E)S8b_cq_ zJtO?R3Hdh!vH1^X5#xb$yHv;cp}FuM$MjNeokcf%hcRLgbw^oM?2*@5U-8 z`l~p#BxUa4o)W}JDJ0b*-Fh0k>rli7iXGkg;4>`h6dQ~X;v3WR`r;*<$(();BKyFJ ze*xFC8U6eqE7UxV3w}bZnQ41VTdGb~JNqG+YF+Md^}V!}@A;kRUgCiwjB_^Ne-U@P zOZEVz*V))tNd1d*9&Kc*qbPQlZQ{kQ$tniC+am@zoqi-#jar*tF1OY_p~Jr zU37vyg9<+xqvOAA)k_rIr*-sTRiDX9#w9`;lgDNL^-Hgoh*{B;Vh1c6R&@T^8R zSu;B)-wH_;mj}t3buBxFvQiaLnR5bI%9?>c+pre_a>TfrMTM1s6mL0;pXezOno7>? z0_&z;Jq$J+TqS@y#=}!AgOYijayYt9KudjX9)3r4DD)!V{X24@Xy`>5(Ky00{?yeU zC(pQ1;leHvA8om(_}TJ6xKk>TBoOZ-nbV&1Hp`bceL!e9K9~iRD z8LG%}-%QH9GcMBsh0W5#$i$|o)?ud1iXR8~^v#>zGo|@TA<4X(rO*&`DYcb9vAzK) z#=Swr8Kal}rljM!(~O#E;x;y+U$`vb1#zN6>lR{`HDs};v<_YP^o&D1T&3V=$PSC! z0xOyFY+pjBiPj>_;y{kbOpe!hqp=@SiJ2A+Ni80^t86K#N8?6_^Id9MhQ|QOZXG>t z+uWbl$NqaQYm@+=B5+57mjWX9u79#9Tzbh9&d5A9lnT@a=Z!h0h`F7>jji1X>L=n3 zOKPUvC;)FSk4Z6ufY9yC))zS%E`=)1A{rNq0XUMpj8g9NuhgUg?XSLyKcDpadw+j* z)B%u4U>e&sOshX+Xw;P0smz6aoS_3A5GGWb(h6Q)tDrAnIG&XFYO3Eji#SNOb% zIBiQ~swxQUxIHL~BncpK3=l2{v*Ylv<|v9~elI&LQKPdOE9Kd(F%yM)Ph46c-+C|( zeY#_Cw1GmmN3=IRE!~e^Cfy!8*ixVu6OT-s_(CL{$>I0vxLomIJuVsjQ-L6v6*?1hrsp<}i|MD-M>^H~M&G$^el&%}QiXy}T;At&lY7d(5C+ULP9E6RBoXgy*_GgCew!N(IPU5w#J zRWg>=z`xdwPs8X6{nzg8boOiL=%+K}IYO3SO2)VdR18%;|8?`A1eI|}0J8?aGiZl| z^Tgucw`{KQZ0kt7WG1>BFI>>2Uvr?{Q&;~WlDf+1o~{hXr=LBvy6Lmi#r}T$|Mhsm z{NUxP-%}1>VtrmFBGM~${sB-Lj(LPi(0zplM59vsz$-wCo*&cK0Wqtj&$KXecJ0De znBn%Q?Sa`&krr?`k*=*8FQN44%xQ01{9z7`?uDM2EfkCNs`fy)Is4ySZdp?TG5=V1rbmfiN>6ThOodt5OOP=mQg$V49n*Vs5H8 zk}=y|JTokbD}KAx88~>a4L;{py;)fOHZtaLHB}`E!|C5ZJIy=Dk_omWZ98PG_JHJ$ zFG9V8)rzjN&}%?C4=yHrktKj9Tql^UOszE81GtojQ|NPoFY@8Y-k3CnPx6;Jb#U4$ zm{hwzCm$`?8Nbk@Qlwz789)5<6QS{-sTxjd;C=-;5gxbM;6X7JgTYURzYMXB1c?Fi_~-LUO0Ova6}`hx zG}@6felnNB4h^SsLYZ?tLejQ^$Ods5ud-)cwFawtVz%69vR&5+LOg)nE6`FZviqu@ zn013y5v*e!0aRSNZ;-g@q&^#4q8ULK0FzLS^nKl@*c_w$LZW<)Fk*Xs(MI$qgbHT; z9Tc*^-ero5ulXT|b`jMYowiMa)igE7y8R|C$M?_`^t_6KrD>?!O%EqTh{4Y24d{@Q zc`lM1jDJLOs^_{K%GnB6tC1^hoFNw%&b%jgHfX5YsXoy~@wO*wIBehH07nt|QMtu4 zK3HW|+#yGB#+R#6;|zMw_B(&$LLaiZmqbP$wvGDUts?2hMU$6e?Y>THZ)aJTpTt0MbS#eOWw3$we z3*cqMKz3z;$E1PPpt?Z6K_{S5xelh590t{_B$B$}}9>VKYm_U6di>ua6`W=ZvT>+~8AW++HANdyWVZ(0bIr z_$}@1=>aS|{HL-Z*B{SGtz*21?s0U%d8UnwF{z?Gmc(s}E_+LqiT?Y{3dj^_shhGMPmc8Z+RSqsPEp-E_V^cHE58MTXm^D! z$(FA*5_mE~G${m$Jp@gogye&5C*la@!W~8YmGnqI?SMiKOU-zHY#DjAqzGSN4qNa^d2FdtDOu4Wn_A1AL3v%sM!F28Ni2jg&IkO`X;(P^OqA34p$0S5) zGw3rR+@j6ge?i@A6pyTZhBaIqgOJ^0{h{pCwZT}%ZuOj(C_YDzEuFFXwq6@UQ10{7 zP)Qudkxg3i@yx)PdnwHo7=Z`vaz6i!pf{a3Q z1~baIXkd}ZuFRnkqF7_tngNqaEJjaJnrZ_|B)U(bZiEW%mLG=RxLvow+$4O|*v8k> z=+XK;zkpcuG%}Lmc$hw|fUt$#=8EtZvHq*U2Zd=;Lh)d(h+@7CgO*0d2p(W9a0GL1 zVtUofqV5WFSyj`x1|RCTYK29RuQv~a*aMvhz4o7KBp{|8Dv9kT@qZCq(FQ24F zup0JitE)#&>(jKc=bGjT>0PL*-@6?xCG*{uv{Y1jrsJM)NJ6oG9)U*~_~{EZ8v#=wc}j`sOf>T=MqVHpOHiap zYjI|>X|Z&<{+qS_lsB7Wi;tF&bA3swD^avVgPln%jDIg>m~|lxwUe7i(S9W%^0DrP z6zBwm3D`$dizK2*KsJrQ4Y|8TpADpBG7EjFQZ786KIn~aJvrFcxq)Fr;H!85J`N-L zEO3(`&!SOaVZCMoQ>QLtN1eam`+z~HbBTj8vMVg_uIuITPwBoUyhd#)^+!Oo9XzU)3+w;6Hyokfi|tZ z%AkjEq9{WyyHrUPM;tjf;iF1op8%J$9^hKl_q(8Kt_J^5^qA*~q5ZsDnhbjJM(Cnp z!mdnWa&|UY)z4`(C=I8`1TeP_JaLHrC{%5Eh1aBE z)}5ZTZZDRGPkjb)2af2s)1m9_kf`gb3bY0Q1&w(HBh|i&qF*i;EvqPL%`CU%BTDDr zv7cAo^06}VW%6$fLsc6uJdk3z51c~zOV{mD>ureVWmQ@%!3%FT08>#&Sa=N2kU7%F z<|jWNGHp~m9I5ccw>j^38{~l1wXouke|u&GGQjtKW}ZRFrV93WTrd_|_r|?-e3sj6 z#{DbWRHlECZ)x`|jkyED9OJBTdQOUI@Pc8XnF_M_9(nm3m>#eaEHxD>tY2qRcIib0 zsnCrY5H=|&#FU<$d>t9j0ggMArv1OytJ`lwNrY>)kaU_71zpZkj9A4tp{3(_x-a+ua2 zl9Df*j3wD=PpImG5B`MiX^O?-CcQO!;9srW0FUhmR&PlmLy2UyCB za6idG@^wt5GLBsxbAxVT2gqdxlJmJNOON_k#0gw=2AENBFNG_*bkja@X;Dc>kd-s z#P09QWy#m?kVWg+ULk<)u_TD7BUT};%ytBD7IY5boB&GCr%){O2HhqV)V{1*e~UmS zU;&Q7^dyhR9!RpeL}^m*3n*T-KiKtq+>T}iiMVd@dJwSSk#3Cf#IACw}ltqLR0xArmM zredXAMut!xdvf7j?Yvffpm>{fs5d0b7+>yw(FgI0R`$9=;6x!3r5(ERC8}UPRm{l% zy;_o*l~|W;PyF)(=8E8YD1_!tUx>+DN%klv=vU6x03;Wyf?yfBl1;Xx4{kCOw%{vV zN5550{JX4IDgtE01$>YP?igO|qT=j}4Zk5cbG&s87#f$2f1!eqmT{I^$SL@$=-w_q zwOjjlMtQDdRd+!?@Sk;2TU@IrBM7VWL@norC7=xyQT$=K;rA)U*EcTmN&2lNbq0o2 zVH>0rAd$6lYh`z$5Ge(?%(C`|irQeG4_|(~1M+UIYGFApjz2Uk%2h+UZKp2-za1s! ziH1OCUrpNv?`Y(|RN10_7BOiedjN~IkFqSH|5ZHW27BlLqQL-Y<(hnr@~r`nG4%PU zZ_n)#zOBWDF2Tmv5N_TT5Wy$ZisRM?jc^q$u_ZKn_ynrGMT7i}SGy0MHt+svE)tYj zG&?1nQQHLgKPS3~o1D1=U_6p5H<$5SJ?o|~WbavY&5pdc!(kp}dCGN6?(9D&Crf;` zL%^d*`){NldrYo74}KJg+-?gieE3CLP}{5FUz5BYGBys+vv`T-laR^;(J{12`5aV~ zI!mq2M^;{L!p3^BMPC`FbBj9Tk=lN}p$iQBE?qC_!hi)S9!++OJhF&*%NzkO8@nHU zK_VmrT9#^g_IASVUY*GZNZ!=5?Y>Xx!+g)?xLyfasW0xd=Kf07o2PtadTso^TlfV* zFc6yiqMAE?4L@=@gmz>o;$uI0Nn$zv0}=VgL0`P<+=v1YTU8x}bJQ;PS7aJoepWX% zrmG$)*sE-k8eWq>WNiABfPL4eIB` zH8ZQP_M{hUkfw<14}c`e2E1xVfPUd!cDRv9zp7$ziLQx4`UYfKXxw)Z?D6)Jc@-(3 z40WuCWgmslP2>kG_B!+wgbC+s<6@A>G_a@>?h-~BZq@u&nPrcaTlYUWEw)BXGRXB8 z$$|@4z&{g=R(Hj4+Z;?kZq87MQoHtgdPG)OlxnjU+|rf(2@;R?A5<7YHCo@qDaJqxe+u7!(}m6@%o$f*$$QPXm7D>*wNC zJYGe3+K1%!V*B(Dj~|l>1%zo*8k0plpVur49p+&}II&Ktku$Rj%8IhJ8Id)*4Wzsyz&48_mn9 z=ECW)@K_=CkZubWh^W?&{Ha&FORByM*_IUGrQ|}X@1BY=iiUqog{q$q09*=LftH6M z>MtkIlB+Waq=K$}TNNQUIo`!=O4-O&6uQYKrkrJuOD zW=uJA!R1=o0sOar7Up3#IIKdS3lW-JaEzMoqttXx4B&e$-wY)zWep3V-BD1n@=o zeP`*V?wHsDcq)D$O=Z+ng$--`d)~VrQR~`1P-kDEe7F235Z|}5+%7%e48Q+WQ8*%{ zhLgEvqC+W--rkLJFK^ij!Krz^yQC0I?h++U*6e5&SSGTQG0mEj03-kN6H-zsasOL1 zz52O`l!oLMw$Q{O>sWRW-oH05YG59C@dYv7bUI+X4g^xz+ibm3_5h;J%6tJAED{@P zYy1`K2N;-9L|MfHUW;m9oqN*Nwtjw6P+;rGSf3J<*rREzuAxD80~OS(Das zd1B8VOi5X;P;at8=}}lqP@CM=7;c1Ds7a>iW2YRO!(G0%ejh^=sDQy;tI3eNZ&M3d zS1-}9>OE_Pf*{6k=gZi#0$s&=1M_6whC`l07UPR0`N>x(1?vT!$U^xcJutO{;vo2` z>b6z!y$A7``%r5dR;~;Wxzr6C3SokNaOC)N7l)z4nbRR%8UDZCxo?2wn49r(LDYjx zXU`GR#J zm0rzAi~?a-i%nwFW`A)|T*1x0wtz7?CpdeIWwo}udr6@beC;`;Q5#8EXw@qZJcsyz zfqQ4^InQZ`_WItNf2b*ayuGS+>#cCxzu3;^7j<8*fSgj=5BAG4 zpqw?`6@LoycE;KugdtC~_8sC&|C_Ltu!_z0-NjeNF6N|vS;kPy=+GEYR4hExrAPMK zCWg-2)B5|;GgkI*J{Lxe#A>-;(jsx%X-wnV@ATt#3X83@M;17%6_^!|&MM3=d;W8W z<8iI?o15?PxuH{Qa|m{I(#68-StL);Z$a;3a_RK#2#JY2Wpx(NCPRbv`Ae}^+ya7V zkMF0_>*3Pw@|k?7uB-3yQx;+rTWYnPwIBlljbpG_v>;)-4U4pkKpF^OGDgr?F~{~; z*97vx2G!dIePVS>dX)tmG`)}8>LTlDWK$4l+v&>{B#->3`qSyK^%L1rZ2-7yxyUaF8KPI<2X zqjk8rwNJo_ody*=@Dgdv`vndI$06lA#Fp}4P6;sj0HN(n@&jX}jhGRQDmkk!cE9}5 z1ezIF^4_g#(+%1fqY#pKfG@;Q8+k(s%)a_vlvh(rJcan5qz+Yl6dNA(wna$K;~+in z7y!Z@ihMZ;8lJG?%59~?4qdc_{tGFta$N!GgfbAepjiqmR z=uo>^gA4O)UT8S5Svf*L8lTB3!DTNln6q4B;Fe6LTPoxIZ+Nr9_EN{+-0B^i%4qb7 z66U+04MiQ}E@BL=I*Ghtq(=c88*lUl7}htb-MOpHW_4fDh@_-Owmh63cn8rM_!ch7o-J?C)-TTEPj0>N`sn!Z{m44TC(zLkYW@swiM` zNIR$e3Ou#^11f(FAXw{ak1}QCf%_S_hkFBu6()1Ihxs((t4Mhy>~jb1n1Pu+sJb=g zU%F20Fhvc$W}ye}l7L#~Mu0(*Pnci{&to!%h$A|Uk!P0<9W`TNKae9X3tC(AhgevY zx?xY1#*MI4gBZqZSGNtx{W2}dbS+B9tCSnL7KkIF;*bIXXdyjr0opS2Jfz%t6PF-un{r=p^Yu3%rKHnypX__S5dEsee*X1V7uZoBl);@C_*Er1FDc|Urx|>s zU9*V?Ae7yoSKWcpdh=u%BP|>aeDyWtN&1$l4oX?n8+-zYDOs%t__r5802`Ao%lNJ} zS|6A9dh{Zs(Y++5h?2Rk3h1#{b`~*!UhVQlw%^F{ zDv*%H^JubI;S!v)EO%P%?4U$vOMh|ND@UhObWnIuL9#Z=q!>pC`ykt(omzB~(9{SN zJ4Ca+hx)uC$+bF&z>t}=uc~_ap3fxXm|kwLucZq5xm*Iq_jTnFIfQ@d;uo^fIeS#}2c`x&z&C=4%k}4Tx_`-(Y z2w>8yyc~&!ml$ApM`KH!g{rBsaI&V z1TnII%%4yw{r{XI?3rVIfaaTFVRL!!RsFAwp=}Sb}!Uq zRj}#cM#pbHutxAQ=$b!y6gemq-cdLI9^a*sG|2|-ZWco~v<%*9B zNsBX>itYIvH2EEPl+BAlCR8jTDeUs@aOM}`yhU_!sEqr=pdcy>PSH;h>LPfiUN&(Y zFPH*+A`#L1hGTD|4WJBmp=Y6_Ks%R_nYziG%+ABAa7!7 z3OqatFHB`_XLM*WATl{JGYT(EWo~D5Xfhx&H8wUd3NK7$ZfA68GaxVuFHB`_XLM*F zGB+|dG$0@#ARr1aMrmwxWpW@dMr>hpWkh9TZ)9Z(K0XR_baG{3Z3=kW%=%?iT-(wH z3gZL_kl+%aaS873?(Wt=1C6`8JHg%E3GNUyxNETBkf0&K;db^u=VZUM5CXt%jx~RaRpVF|#)TN!r`FFt9K(^8(aC+ESiQAa#(FEy$Tc#sz2tHU+RU zGBdLyQ&NgKfq*VxdpmKU3y2rMY0a744kP}2{1~BmiD1cmm z>YffD761+KFQ9Di?80CIbcU!wb{1ee5G}++%-+G%32b5M^4kX|!*53bb9<-XL;$~; z06-otAUkJBROjDLMHvCIKvQdbcV}xb0BC0hkY!Y01Ss0OLxf-ejlCVf1Y`-cF$dV2 z|K&nMO+r--Af>9Lp{z#B2+#zBTr&XN&AQO(uC!QSa#S&6BsYe>-p#6=X*5zdVrLMnmRo|Q5_=uOY@r)}qEQX^aabk-r@LZZSX} zYznC*=&z(epudy~B8oDS5^CxUkZLjfE;z&Ay=QdsaQQ12RS6Ms1&RNq{!I{U19JYW zU%!2sL7EJ9xm8Ot^2Rpks|Lqa-utEI=**W&p?$vYkyWnSO`;Ycu>7v-}oAD&p(yVDA7h2iiD;e8J`*$P2Q! zGtdn(rcSOPU+;e^{x3pi;R2X}OcA9AW7|K(lA&fFfr^S2nn1Q3|E~V8Wm=%$ z>C-6MJJ|wl{!0gTmIQl%%#^_{rj~#A>Tmhq@kHz_Y(M}87LLD#8o!Sq8_2$Zoc!S5 zHx7u3nfbqTkdZgFwgWjk12{SVQh^{v{4d^+hW=&^VA7CL7L(C_|38QEucZ=pruJrF zI}6CPa{_=)PC!p&X2^uGa&Q2=Ss?qy4CL|G2m+WG?d)A3CIAOl7vJ9vM*ck}oE!iq zk>8@f5f^|-><{7wFp2*`JOCz%{~#`A0F&e&!~$TF`h!>jOwxZ48-PjX4}!##`-3g{P71dw)p*=0y&KTEP*6y`5(v*Nz~HQ!4mXOju6>DVlYGU zwf+Z$B=sjECxn2_?}7cJhfuWr16d#o{^6SilA`^e=#aJccA$T#A&edVs3EovK*(*y z24wE?N6PXq>E9>Qf5ea`Ie?tN_Wvj^3#1&5|A3Ix|4|9Z)@1raoCBhC27CNN4RPr5 z4+trP>z_tLZ2x+ya5lAf`ey==>bU&_LK1ZUNBbZN{UZV^BoohnKuGdlfAWEN@&Y;i zU9A6m1}Oi&$NqKCVE%I`{Of`0FRbR`WN!`90-He|OaHM%0qEic_RwR79QZ5{IppWx z?+pG=0Lnl2s()CEirRa4Gq6JdJ3z$0HVOkPWRJ73{r<(w#q9fkY)$`u4*2V413A6^ zjep;P0U(eE$P{^X$=;MN#44>Ntin&CXr>aLl85noHIAURYy#YB=1dnMo_PKa8Azx& zuq_~qs@Ps$n%BTDCD5)^n=%C3=6SO{xn}y>OhtGX=%?UEh$bO2o~OyE5tOB{5>VMg zMtdxqSEy6QK9|*z&_N8)7(Wr?>FT|UWu1C?dzDJ2U)ix<0PkM1z|xB4WP{zjyoVb|lb}fp4yC@dxVhjAD7`IzqSTqMQ-$gQc$;8+25FqvbV>6ZRFA?5KQmvFd2Uk9BB&d->A2iqIat z=u6Mbi#;#O?ssyl-J8TEu9nSO!_U92ph@UqSp-SE`cQty6t`=#Q2JbufbabB*-vD<#62mu~H#h*9x%Cw-36IsG zVgfZyc;;qu9V$LHLt*d4@W6Fm&D*=mp!@^hXi^QfpG#dJ2ev2jymuBhSZsQ^n@C2* z-35!2j6wK|r<7vNAUp7WF-fPSpxqW9+?l|D5fxy36BIhZ6hOzaW=`qD+-i^8%UT_)srIzipYFF@A)Pb>#b% z9>7GCsP@6R!b`!EV^g=VI8(S0F`N(ufv+%jV5RehdASropM(3oWHN^Ee1CsbahTpLF1(p{t3@v(Mm_HX>twA^XHs}t#9cJZTayvQZ)lIpU!p2`Wl}Qm zU~*gvg~?49J5b!w%qIDjGxbz<;I@k~j{wj6B+z8a!QsIrO9xqU+UJu?IX$|!z1@;3 z6Gofq^u{AKvZ45NZOLBS^G9lI>*pPy^vIG#+AHvVO z<-J{n>_U2=b=m?K?WxgX++_`qm-$2K6`G_D$Bp64VahstI^*rLU$qF*8M@Fs^5=i* zeE&Gk!@cke0~WIfF|s(d?3BfJHGyPS+(VMouJQx!REUVT^n1WMkhbfJk=c@te>9Em(`Ub?s=>^=Ax~IYsA6{!e5yy2v%+uy$Y@)X16-5jyH1LRz=D9pB+f;U%bGpEWHDxq(lR9qg! z?tLgKp3?`oh7J>RHR@6??fESx(_*bYXB+sw-N-=>_%u13Nh>b?^OzSkO81049*KUj z>R!XIX{k|~4wm*8`ML7wM>@8|(}L7r7NwfCECnoSpjSvjs0k4quQWg23aixv$@}Dm z8i@sZCu-o)V>IgTAI$n939(j_ceXQ7SZ{uf+K(*FecKrzcXoEr-k)g6QkhpGicw?^ z%&UwpwrQmsh-2~y^$Fj1+5Kt8aV8*oJ7wmsIH6o6RrLb8r}?30%E-d$M-7 zXN8ei&OH#gjMOGYa~l&AFi4+>9!2SX=3g7zo*La$fqZtSV?2wM0Z-A#z7_sK5)0Xx zlm=5Gg8G=oJ%XAwCq3zXIlbP)h~v|{gCWl!jC*OFm4zCZQapud6U#NJ`W57zppn4h zUh3qH9M);fytQw)Qd7%8Ia_ufKDK;FHMauxLTz*(mk&A8sU*lNd$Zrn_a{*+&JB&t zd@}iV7sk58_eo}B82^a3LML1Yvy0QU%5+@AD?io=VwVs9G z=1383eQnSvaW?rVw=(ysvG(oKcQRbsJPkYn=FDN`=Q=*koH5JoRenyZe8JS)Pq-;0 zSXn%LGy=pK2$b2+Ftp{1me9HiB7QkU49|=-AOqFLd)*dq1BSlJXRMAx^^t&wcxNmd zWiAq|_dWA)4KYDR%qsM>+o>mP7gmZFnP(V9ZC|`^B#-n7BvSUG?B<>t`~ry&490jvDQ^TO=)~p5JuaeoavUZ{7lvJUFKf)*}YT1H2BY(X8 z0WaXY5yaL(o&&5HS1jOxZf+cS*KzD_sQ5a~M^R)iPOYWGqrCN4C+?*gQLSebgeV)k zu&bi!Wm}FY%9AHq=pUC>h)={@zSjQad)uui#UV{h>z`#XNiI#Lr0U*PL;Y%dP*sco zRqyffe)06FVDGkH1YvvG+R;tlca-Z|mi$tGNJZK9w(#5jrP4)Yby`rw)yfcz zv2Ee`2v{>Ju`v86qHGK_%aZM?@k?FL;Fn|@^OR&nM5nq;b7<;1yQDh5Z$!K-W)V@Q z`GkHy2k?sYk-*UJ_$y|($?_9}O4Z|dX87HNma%uDr31ebv|mmD7ZYu&dy^Av4X-NF zc2$X~ziJzv5=AV%XWvlOk9l!WjkD_fV8ViO=sZKY_VE`x!vsf9gNdi}X&YsF+_ikg zH>pfu3-r20odr1^xnpB=+;B?qr$KxVde-x9wH0HXE~pk+YjPJhr$w-Un3pyE#5%ns z7g{9PfP)RT83$k00EGI`nAqP_!#H$PCn&Z543~Ehz;3bq4a$^t-LH6jT1Vk1(B6j< zYIm*ly^!|^6kF6M*Fh!r4r%BVgtL*?!mvx_iQgWP9}%U-hLxK~>-W-!Qi*Pk88DnB zD@uoCR&H2t#4JK#Yn+MBz8pq~F<<)3BI>>4QokJ8H~_Fs2@{!zQiN{v)&?JkaA)#4 zW3+vbP_jupcJmxuR1;1k)6Q6w;*`;nHdO5oRQ@o=he2AvHtF6Q+^W zdm`$*?HzmFVPM>y79|3AN<0rblt>TOmBdqeGpwhd)&?2*g|(8uXv(FFb}$4VCK}>mc~duNVM2$XkFE z01nP^xW`H{zHD2`;DOdoJQhFRTf>WO-7jrq_f|*bD~>-huOwj9qlyG2x~P{yG*caV z_4__BD{ic+*fp|igo_T&^E%lMU$$vhj;1{W`r6o7G-(k~wU2@A;||yb8G$-kj00#J zoiuUfh6f}-Hufkg!I-joSbW|@Ya5WpKDXsCxBSyof6H5oRknd~A-y(#<~DTf{8tP_ zI;+P_qTU{%<%HA8ewMUu#Ts#JC!=^I)^yo+ksP(OVx0QwIqm5)F)5hj!6UaA>YS7N z!i{@#CR7ITdI?OE%-cn_Bu>zoNIXJ|R4oLuuwsEDLj|8Yb;T5L&`KE2O^*AK;bi@D zc~cU>6eJ*SnLZl$uS3R6oFSfa2n|6#6dDM~(Mk-(0a`vNB3UFMPv-hWy02A$x<-8R zSH2{uACliJ66CZf1TC_2jC4FvF^t^IU|%=NTT7J`#2zTK&rIaynQy+|(`T@M6Obk< zRZg1|FLzCLJ{UP%sQGBraDMfTyp9pzz?2@*%re%+awCX`G?$SwM9PMC{?)m$Z%DSU z5RUr-Pg1H?2S%{(u?HkAf`4A| zT7tiw42s?(@mGSq0i?UkwKVc5N@*2jN@ePmck;OHk-+#GV5n14bt7-6B)2v2gMg=p zJ5h|Pt_Y4=Pk=F5C0v(vBwqnP0V1|xm0CDS2TQJIafIy_FXNA#J&dbF?N~&4#zWh`K9o9hh-UPi?j#KAM6W4q+f`cHHh%n$xLQWlylR#NMx*BzmsU$DGm{i)3apmoK`m8~-Aa^JmN0@M_;;$Kma zE}hZLDhKZoudAK;^Oz?-D}VAOhC?bRC$bg?aWaY%Z)G^=OXR78A^M<4(id+;`ofmh3kkVL&)fh1&Ip zjimP@I}Y0S#;@ZJ(}x2qghMFXw zTc4|(hwokr$HIK*n^C4&=txU97ZBHr>1jLqk)^Bx@N-X_SqXpG^R3|CKi;cF3J|dB z$`ccHoHZz0%5I78D(_Ch5Z~^<1E1{}MUJE-;d)d?nl)+q(b}uu~CHDTF9*^*gK^NzXp7&l+PnBHxCw9Twi>H`B&t{pR@EvJx^#<0$G9 zLfb~cDq^D2ogtJZclR=QITC{u!8HoEX5Kq0&Z~U@#e+`aSSTgRvADSu=ng;KNa1KX z7!PQ{z+UOLnMZf{wrSaYzERsZp@7w?grqf66VhAJCv^UfPshVFkpm9~v6zmhZHD)I zFk*u9)*v;6AD>u_S))a<5v%n@qc_O`Hw*BqB!>@JFhascFC^R5#d&$xHr@(OWn0$5V|t`xnSC z*uVM!hT_Q@LA+^BpAx&`(>n_G%SU1E>+-)OIB*USjI+*Ed{kXUD;StqAYQRrJMMc+ zeqODNr-Kt1o6+)P=k1~K?EnGB6+xuQgfkiKHSV!)96?COYq^EeUbN-9rh*5}MMBFs zd_^F$vsDqVn!O|QkNZs>7xXw1dsPi>$TMn+mpy^A6{QjLY0uy2(l~H$#3L2?GKJTS(F*Nl8KQUv7zv zdCR{JzT01jMg1CBia{0k1Mx^O%zqu~y8^aNXiB99mKS%NOgRP#-DGTN$70P?H_368wil>ia zF4lJ^Xw-Io;$y2A#o|zNmN!Vg+)jhjTUTq1Kq`-3ib4r= zyNu09dw)TxPhC~7D)sn7R#JEXjh8ix9tC%L*G~m?br!4mmPX%PH6Pb=JSS|8BXE)i zN8h+zX7zvXUodeYM9F^*0&dC4TWW+}S?Q_NPK69@%UK(??z3mw&O6t5>-jB@& z-t^t>2$u*imH$%pUFs>>;JYp$#wY`-Cx!@z4=;9d>a-r0V1tdo_d#=H=4wpg6R|xv zXWgn==KC=_Z_1YE5d8M7-J3=^AFgAmgE7DhyzodSLF;W!Ej@nSkzZUa{U?(e~Us;-ToxiO!pR>+H+M;^P=u2gHDS-DZ>G0)K`EDmUNfwPbzsgayl9)`f zY|R$4U&sY*W8N&{)=o!efPEVxSTNYlbd^rv2l7u8lf6By&G71hrJZVppabB3v3@(u zc`g<1jacGa|JTY7IAC(Lh2i*25xuTEDFS8HqKjk0^gyhpYD3$xTFq$Jlrn~@lY%ob z%K1t0u(VUl##IxFHcL`cuXM{rpBKM@BLagV3EDS;EBhE0!V9DpCYaUtT^BQXN*bzY zgy`?sqpQRyJtvBdx7EzImx7BIwn+ zk77nxpmRUBX{cfvC7o!fbv3w&Z5KV1R}w4VsiO_RVZBzw2CL?Xv2msl?VY9LZ+~=< z%x3eLSAmgKTOv0Xdd+`Sl5A%|uUxvjL>_YY{gXu&2+qH1*}YlX$gthcRCyuzEGWDcjc-jg5m3$xzcz3oXX3$P>L+<)=b%p}MTYFgf&oS5Z1L=S651q}$%{e$b2o&Cysaq@COR}Y!Zw6{>j!&hP~@Z#x>WW5*nWF zB3|pBr^h9fJi+ zQ-q>C3!#ZN>4*Bo-hXCo(L2%gMT^q;LAoMY)vCh2psMxJs(IC-eMjHtp4Z~jrOwx4 zpx?_|EQ5aCse0)Ra?g%0qlL$Z7M?X?RYb3?F~XN9ZkA)HKFvI08$#oX$rVLy$1ooq z@4oNs*XS}yvyw~MEiU=wdl1B>@iVJ^H(&Kvwg?Ex@ zn+QrNsu!2SRz5~#&S&oPZAd2zQHw7$=XSd6^koiR%M&wMps}ta>#qI>6%@t`c=*Lo z@DD?DilPvzA^z@MDkKjF^5#6XN9B&8X)Q-~owFKu`$Qk5`Rzo+4<){}`7wGpnS$i6 z2*18+quR`)+R|yr(1SwL-I-!-*{pGQJ2zFTuy0pPU1vZO^Lv}2Ozr27d*6cwMfF}m zxq=paYdWDwKiHYpP8Zu#T!J^L?b=KKdO9E$yOHwSY1qdp{%g-q=N409x~rV-t?*re zSW1i%q0-MuDm;_5H-{n~%IU;R{hh|URSpl=#i+Ln@11|_YM^Pk4z%LNpyDKve|AcD z^1O|Q7r3Fkx_66NNQqfYuDcz|cIIbYE|m9RSVv;k`Ffc%LSwxdA{p@_T!wMLRevD9 z95DKDBjt#bu=1&9pF6pEL~lk-JJd8324U@dS5V%9@@(S*MSKXe&6DSRb&F+?&ZHN~ zI?(!ZSN~a^;`=)qX>Z>olQ`I1ELCg#z3(`Pm0TJzrud*g*~tr2pMnT z&b069UyuORQ@u3~HNEdH_ zbv_s8?q`*6U@L9eL)^aNJpVV&iSRG5L*#4SR|QQYma@_UKr)OFz`@4GL3Y|pasOLpPuOf!F|)Hu2#d-7h$Om<8<{PRQ8iDLk~M~ zZpV13kp0M(ScqMt3bAs1Lkl|)FL5>{uF&+eA_){bsYFYj%4Vjj;LtF6>P zLJ{~jZR6dOmxO&Gxdz+Y#nqUBr%I)eA%9!AAeRX`W-$%%$lR}T#Q7^5A&;`S z1r#1|=LO;98f`CON`|==;&3~o@V2mLCnLAoNJcF5R}HMaFDZ9*akbB1W@4}tCPdFi zSQwCeLV6@NGI9nwQB5tovJicz&+iyG5B%9EDwJ;og{fJZ0hiEZH z_$iNv_|?8^! zAD_VT=b4R<^eA7?sRhtokRz;X(|voK8O4Fg4c10=5e0-0P8oL*z>ghUDH;)@Rtz>!5URaz*wL^t@M}u=STVR18NM8SLe+C&-6s z4^EQv>oXB(T*uw-;6bGHMsy?IP*lnOj9HjZ>{{~*&}n%(K`M3?!b8}R@kYXk$?#Yz zmQ|&C0pFR4ljlZ z@)YJTLw3B*B0Am1BKJaJV1;p1%LV)K0=& zzE~K5#P;jJ%M_rud+}4~^=Brzt{(OdGdY4PFAUvxls8M|tH8sAjR(C@s~Gk!Yodqd z{p}~9@?QB(axlUn9=zRo4iWSewZ>qpSnv~)TqiXJZb~$#>a%4^nAsDN7lSHYb*YNs z``YH#u>LItsm==?Gm;wO9A@5l!Qe>&18M8L zR{Voo?)uD@S)*5ZvV?KzBuY|C%@N!wqgnF~4AIq48re_Qu#E=w(l5kX2pgZQsTALF zC{XnWrW9NcPMGj9*Sjr*5eE$hN7_%L{Mz;)xh3Z<2-BD0#mP@yX-D!}%dXXSBhRH&0J^zV%7l2VC7{=*G(m~e?g^$x*l~vS|E!#Q}*1i6q={mMA z5Ie%(TjKGuWYOAnVrXRv1AW`kk};HIR}Z6L=ANR7L$RPL%fquBgnpG4@A1WXG;0k6 z$^s^V{C#nBX|p#{3B-tqVut$ATc#aWQ^P!W0|%fQwu%TY)fIIW9Kpp8#~a)l@Ruc# zlYLR9(Dt4qGkdl>3!lS6;4|Yus;}lrQi_!#UR{9K)T6UMkFchh`j_Ec>R4z*5i?AC zIB}KwG)@reBfB)YiNR`44tAu4ATQe_$|HX(G_WlbKow@dcCIQ18`L=sDiStZc0$w90u$lo9F6^2_!IwW~%juHq)a0;{IFWlVlA0zlKORL$@T zC`JNgHq9~mINFf*b~sS8qdh~mJuAy}ojm&;1HRBm-nb?96h5>9^2z2DG4}Wq9zo^T zU}GTPuGaS-Yk_zHIj$uqP^cvAs#FE!hwZ}KwQelUJM$P&s+=FJtz{~979uzSc?*hV zHn@CVcXoJdYJ3fkg;f5lUXy(ycjV4qFA+d|7FhpqZ3-gSx!rVZYvpi|BIiS8q(7ry z(3PMaD;tXi2{OC5!3$=2@vikmioa(`OyBq#6cv%3qxJ{sj~TS{;w_rY3;|mMquWhq zZ0?kMq!viQvB!az+s@lCGzwqNmlYkAs9oyE zS+B5Mr(!zOUFxI2yX233gN-3n`V-6Y&tO+G`_2b*U)^Z2El$kJ8ZzU^57J>|n>bnm zuQKUj7x|3037*34X$DfFVMRZ^L@tYXmsHM1U2a7g_i(W=iFTOzP4PMN+M=76E;bmo zD2GLVt+VLF3B=;(O=XNtq%O*O+Pxgr;Yf&kNyz4Z6-2-?=M*&#{R=v#u@_XQae52O zH;xpVA>6&*wFt|B_>+HgU@HDcvVOC3FV1&$BU``a4|}PWZj+DS6yVM)Uu$Hm^Rm%g zSJvJ2gPHGBi4TP|;1)W)b_}y!EF5vaNx~7lQ0`rrquOb^Z!64QfE)&0>YK2n_{8j$ zQ?0cKZWyY>OVLbI>MZ>}$BCw6(=eElo5TB_gRLD=2TwwYjx$1SkM(&jp9=U})zNfY zrynsQwjz6YHOfjy92Rbl%$~C6bz{wSTm7aL;IqLCbv6|j3f{at-zS}^I!0n$@9LeK zO@0M3Bqx;l8o6t&rKbuOqdCyHY}V1=!6~RaTu!L>YZlEw zany1h)RTo_&dYFm1VS15>CR4O&=J(zbz+GOj|(u;FTA9$`+JT?PV|M1RXo^}vuu-y ze@~}&G>CQ8Me5+r9{}Lw;K)RR3_Q;)mdW--(hqD(&+X^h7>&#=Ki(?lHJtV~wS{s} z{ESs3Zjbx+?MtxHeftNorQkl}^|&a^v-OU`fVVx30@HE6lwP`|49$yWAwR~0z*wje=31%uZqyb zf|g2|$KZ1uKMg-jF-Tu4>xxiq_K7RQ#wut$&*sEL7>3r0_}R>k3-*JsyJY)ZxS;U9 zv3yEE0=k80wQ$+E;HyKSf?aNhsO%=u>RKr4LIg?jH-0BcfSgkiG4B+M4{PjtTe1zS z9Z~e@uXjNHI~BLoPxtl~>%@XjO*LVlcpdZPn}!4uo}D{?vjoTE>16v9fnYP1@#n(t zD|5=aOu1hpt`{7T70`;3RWf1TH0^jRh7kgNN;tz zemuBQ7JMDWTnY7<3$t7{Sn=k(WObL3OKT2W(vzXHy3J6j#Lu0=vZC3^nOT|S1#B(I zYI;{^=by42B(R!QhVx5)xE0YZmu;9W9$8VHEd$zaRqh&EB=$sTXLjjad!4}*pY_!) z$<`&&FR)K8tN>PE=QBzQzEZcIT-kHB!JTHvOQ{3m2Rcw^ET?e6bpEM36X9+Z64r`9 zXf{Gk7V5@lryE^D5L0*^F~?LwlqhmT+M8%NHmXmQ}-?Wnp^{=(>g=_Lm z{TlNAJH}dyS47GBzHv?DMc@ZR6uL0f4CuH4`zf6yp0@gPL=srgatKM~K6Bb8U3CX!O=y}D$TH|&7#6~L zMpVKe*TK^I&bY4@WC}u0@sf%iRurSvJvmANl&xlstj92=i7uTOlut>(-}#!&Zf-=#4Hz%b21`m!xeL2m-#t6Nl@M<3t{R-_&|QFUA{od7dA!RL?WF-RGj!!jSv% zh*BK7t-KW>C`WCv!`TBkV$k;+)^bE2wjT%W;+4g`WALSsb?-19Q;YO#@;TP~;ca^` z*{WisD4*$C1@CcB>;6uM`(v<;Df2e1Y0|Nm*9zPjR2BK|V=g>2*){*@ExFhsv$@P*Tv z$!V@aT`4SDh_NetPR+#RitHk0dHyBe6>Z9Z9YvdqNgf6M{MJCXgmW2s%#AV1GZ(g) z{C$Qv82DOt-o%b_;UtiC04q59oq^GXnX-r`D9$|UsJFVSP95pom2;043ax!(Iz)^ zjdG2B8v`3!a{p{2|EeVZ!&cIk{NQr$wSV2Fe$1B=Gr6e(s#ABN2#3`n@#Sj8K>=W` zM!NSExyQ!07PTBE}jnc&3ZnwP%qg zbe1=s7B04Wy!!ooGcOH_&cw}2REY*%n$0F(-d6CY%&@goDzrz}$gz4-?Az|m#;kLY zV~u^g0R4JXkD{7{h4JkMF)Jie^83lqme(bmVuE8>GgP4Vy~@A8AhcOsXsZfCojjh| z3iDNC)cp0jJTuNwf21kT2nBNK?sewskElS{L36U5K$$IqcQk~2nx|>=l$5Agfde#3 z8pnNO795thSXXn{_wD5eqR1T!ath>+HE5=4$MsJEdGs(2IXi_~Tcyjy0~*%Sy=tdZ zc|ZKdQEk#54tr`@O^}@OnrR*n8pc?mp!uMYxqUKRgSbZ~q1|#0nSJn9W3nHGc!-*K zEvR)4$p&fhG2DAK_xcwHv#<2pUy(fc1xz56?sjFu6KmFOpN&-UA!){DdGJw7Pj+d=PrClvJ*4nlOuTID&5DdQavl50M;Vm>znx`*w^rz9;@iVICoA&v zIvp@3B8`21cIE5dvQuf%L&-^AloLVz|CM8fA=}h$!L#&pc@VaI1r}>4e z3Q78&&av_YP~+7P>uXdyGvTIIF`*lP6#dQ1-eP^*4XfF%7f<{O3CBhs?kekoCQl!p zhr`5hQBM_Xm!{GXNR*)hZ|;4E^j#Y%Cl&5AZ32vpL?<7XRSDz<2y1jG5MWd}^*=m} zOG^MzjkhW2s;Qn02-CJGnk2^$EQM;C%0@SOD#;w>7i8h4Xh;9^ebaUq>V~rUVvF>j zcdmsVQn+0QdowL|Xi_$f$-$?wY5ip$$+|X}t4Im=yIoEy+``xwnbjpq1`${e=IiwQ z&=@FLtRrcsT;eT6$t#S$qjH#$oIz2c zD5JhDTw>@RGi>$=3}&Do;*@Q!u)F^yHJnRrGxRR(xf5Gd4!5KFe#T~l&4bnSEkGPW z!PV)K#NmCvAD2-O(s(wx$&TBGfE*z+wG0-C5|u+!n>2x}eZwOLzi%UbSr}$kSeT#a zFCB`(@2pq_uWV)k9Y)E4+@p1=d{|8au5;Bj zxrhtdY#5Joco)xzB^?&?X*B%I6o1cM-x(RSvWf`aKBK(gKb# zAFziGi`N&0o}mcZ+TrUhk4zw<0#^hcNY6s;9(raxf1*l)W@4Ahs90q)&uW`8b(IgK z1MD@-67)y4F4i))5A%;dhVmmnIt$b|XTDW`9gM8gjHwq>nJ4%IaQQj()H@tTuB92! z=t98#J!d{msfg>0kdx*E@$)@JF}d5t!B1%K3#bO&l25M_3K2haVrH!DX~{6i*;yiJ z^gO|?InZ}>%Fm^C1Q%HfkHmwz(`0=6PGYJCXJutj=}MgzbC!Z$OveL)W=x@u(v0dv z`!rAbafkXlw)E^o$nlNEwn7+rImu!2iL>L|$@>)0_WK(pIk&~rqj`xK-mo^`ahC^3 z*tF${Y1Nd@iee9(+fCZtiQKY%ZvC0@DeYsA>^R`?Hb0b&e4J70$_B)5&cd{QYLcxG znLyKGvBWME!KU)7;}=fHKB}v}o|gqna?@KbBL5Ju&QBC(kEb2jM$*<<3|2TERRSF(_6hJi z1&1dFGKE-IPvO1y3Or;BWlQ!(la#aI2rymt7JE+>e7{l;=u^FJOCyeDD{Dk}3?qIO zzaIk(Lc;CRt<94?6kc845edCtjeJ@%_DGdtA;1}d4*9OQ?3w{pYPU}z=Y;=*ST~t0 zZ2WEhN-|)Xaa`l^W4_2w!IuxDs|$k(SJp>A<$*Z*H9oOf>y+2Yd@xSctVJO^Wct21 zZxt~ER@EO_8mPry|5VnhpZC;V6e5`XYRc^Jv};E0?a0*lfDGe5Ndq@ygO94R0 z<4<$cCrvf)k2AeqX)n)NeN3Eq_U!ZVTNrt$?4&FBVpT<%U2Q5ts&>@o>%WIO~6VIdz3iT}3} zTE?KcKm+&slgGl3kLw$4FWmh_!mdo6M&*UoRSmr=6R!3h2I48c+q1=Gmk-%GsX=Kt zhSTGN5xtwX8R2n;v`s~f)ZDUa5~Qd2ApV4~R3zluJc~R9ib;Y}(XnneIisl%k)L)< z6M`pSH5bTJC?uY{Q<13#@80ucCM{{)>83o2Hm97HEB8`b#%t_BdQeake zxA}kx=&$&pco@MjqwR-IlReUMs1#IMHzdTQDH8X**l}&@PEY%UlV6wUpVcQ=gXBKxtbzCWTMS;TBn^P`9FO<& zn*};D(7huT%E$4`^zYeb?UtE~#Voqpznpsd6QC%1@pZl}77z80Cbyqa;@4-%G*)4k z$wNh20D0Q=fDQ$rrWR*Hot>;0Q@c=R8mglO3_VaZ>v1n@tU)@Q=bw{z7hK1RUvo96 zP$P*OTF3}TYh$pZ0-&9q+R`2siasI`$%-GjTfO4UAaOltT=+71qmVlTe0!4OVkwCu zNaKRE<{{7|VTDs9iJ^#W*47>@w}h-zi7k`}PaMPg^0MT*e&8IH;zWhh0ipJhC-S{7N^U27rwK_km%CpWi@S9 z$UFfKiQnx;H;wDFh@Z#bR8#2q_1WvS3rfbyiBb5g zJvN*X(-w0h^eG6jEJ^yIgKLNMu>85V<~sdf*08ap#x4!v_;}sDIu;FO@@Ejji=cC7 zz5TCUGOasG!SD7A8CM3b-kb@a+wMybGxEZI-zV;T@iSIX!cgWiK9^T38VwHRRS!QC zOwuG1>Wq>C^?CQvfzMU)5r3r(@PV^+qq>nPJ~%O)dEd^^u9<&Gnb4y zdd_*h`zlm{BZcN1LF?XpI}rkR2HewsdkQPnLGh0;Hi{}VF3|3 za0UUdz6QHjHf#|@_WQsta|4Sz_iQE;+XK8>$oNfVi`_!XQ>A!8Eayt(lJQzIstr^X z!2F2fbdRvAT^?AKy@JcVTf zUGlYkDud5YhJ=ulBI+A*rE7UvP4yc=g4lI)b?N%QwxsfR-b9VeUQ;=`cvKgjI1NS) z<1)Y37-i$!{fzDWa(YH2+kHpHHl^9kXiyKYDiA7%+h#i)N~(jyr|Mr#nM&*VjkC<& zMWmc#a_jp*X&s*}KPK@!$EomJb^n==tj_;RV?^veiH*#foEO+&Fq+(9S8Q{fzhHxe7X|K})Pw&-6^4-jb6 z?z%BdVI^>6QTIb~Q{bf3EMo2K!@%9p#_Q)I8oPKY#wzk)Sn*lm&Vur;xz?k|D(^Mu z@WOt1%|o1vNl6g+I7*{wNxi*xb>8z?RF0=(;QIZFT+K2;dYawSk1}SENwxW8bOs&+#sW_Hl^8U%2jt`*d1LMaLP_J zXS=Z!V`*|*;LG8Mb@d<1Z??Xby~4NH*fk)#r;&;q3*$1#+lg2CN#d+MEf;N*(CXL! zR$zRFy0XP;m_64P2|ufVCdAntYv=_BhsEN~6573`lY6vIC;7E$Y5h4u@o8DHwbna~ z=HtN6^-wjvYO&|gy5(YL8&GvN^^=CG`coZy$M0!ThO~4%w({R8UytY&Su&`Zojl7= zhPN2$kij_VD60kdYsrr9u?fOSE`sX-BUUq_3dZh>gV?pt#}Q?kCF#{egL1{|$OX*` z8uuwV-Hksoo#h%j}aIQYR(DU?F(V`i$^XS3Rf_--loni<1+?m+kdCw3@_*Sx8N z*R`ZZzfx*g+D3xO@+C?BXz9X|DEGlID>L7@8k72&TKAIrPRpLfBLG}x3I2m>6pcay*1OJ^6MANheyMk`DmNK>VN#>K@q)`A z=@?e7i%7?HnySmUBjp71ts*H^F@$34lyVnZgtmXA*fPdTRoN)#s?ST9BrJv0=~4!R zCQBwV;2;oCtO7Rf83AihkX({4Gp%?-6Hf_@>4Vc(m~Eap;913=AoOhk=S8ry{R7>qwT~6nsj+eRB2=m&ZBpNnvwVzvKv#+&`srgPvyQG7qVL7Z8n3 zqpH|nFQrbV=}h*G$Xs^)2D(cL6}j%cSvM#NWCKiHZyN=P3G!RSK6cs-)}mFh)Qg=K zaa^{U#BCFLaJVbMM;}?p>EkuLMmY8X(Pt7LF5@?dZ44cN8sW?~D18tN&oGC3!xbQ? zd$Wa)GG>>SSz<;tXYUKD`ax_8*Ve0s<}-3+g@I)&&3nI(zF@ZZNgK?0;!_?M6`_mx zL#Yf$bTObAMQYB$ugYZ&tlwY+3LUZgfzasyq#F1I)`Z2+`A9@4Z0~i zETzHuunst1E$V;M4vb1x84H|ht@BRD0EcFHSC|;nx6`rxBA!t%)M%IVX2NSyhm%7HSO48DPM=A}<@1mj$RPF^z;a?`FFiM)2vv_Qu zPgvxTj`|?CRUBu_W#6-=r1WC9Xh!WuQwjUcT~N_jT$mhmFqLeyHlS(3nXB=pu}pzyNkzKI4G}RobwA68N|3fLa1*H#6|tBQ%RJNPU*- z;oNhaTqte`og1#Nv?#sd1bNl&i)u(Sn<}tz*P^PZe4>TpXc&XCBKk^PeHp$TIoH*c zAZrP2PjtQXDfJBMZ+L?!R29Usp2jic!`5EwdD7J$Ji4;%8h^y|&bL>j$f0*R^!R9a z?UQM8pB58r)-7%77t(2B$Hmwpoq^J3(1BDr#LHl!5(;@6GfotzuP(S))L8Fjm`C@# zVN=Jp+o@(NU_2Z8&!chndd-y--V*747kUf47@LA;EJz&k`Uy*jF0XT<0WB~odO#85 z9@x3whrH!+me%Nc=e+5nq=$3Rl@w7+@7rv;s;k2)+QRrs&t-6Wtl?&`YjsieR+45QEhJ+e_;L&Wn4e^7lW| zfnHC}>sx5sz7^(7P^?`uY*?`uWk2hIcjb)WCo!X8k5#VW7VL)iv}huFEb;NLl4x4D zIipzHlYj_zc!s`v@SYVd0rWfXkQRUwBhXTv7SE>6Z#PkAd#Nike{?jf!qje~z-tJ; z_-ei#DP^36QcIE}G?)B`rWge=jwe=9qT4LzPD3tTT?ve z=p`cOq2_s~A8XIXn^V8iS{|O@r62P$ON@Je=U2W3679wsMyu8}MBvI>ztnI9nThIo z5`FO3;LN7SYcHH+>!ieuVKe+f<{#0JHW4yR4E?C8E^V)+W=CVD!NRSH=xM6j7ZUc( zt%8ReVifr(bl?dmgY+5(T9NyD&mn5}Oe3*V7Dh2x)`{J5h zSEKg*o$uJI3_LlgmS|~dDpfNiM?>XjP2r9M_l$M|CqpYMo*UMN$p(72a8z2JBu~RB zn9uGm>X6R6`9bioC;L?Wg4b%1Y zJj5&^H~T}tYs^o1|7d~?C%|VBscx~Kn3+7LsuFKLkg|m9?t2M2C`mWZjA{X~*?WmH zAJRp9rrndT2ifUIV;D#qn6d2I&yEISP&NzAQYJD-Al`kV7}v3fogxT-|F>fso=`~V zXvC;CJ90(m7`x7EfKg+KO7E)5m)b!q^sYs)-m4`^uc2MJ!*;DN;=RBEAx?=&vkQ(*M6i6g3E_!zx>w%fA=z1*Ze4|?pl;JNThs`nv?*z)lV$OF5+PMO zA*TfHlF{N);hZR-NPgf`8fRuHe-?U|pC%vYD`&SKQIP$6w(9b`$8@A^Htu(SX&KCW z2+jXy8Z>^V)7ASz{DavET1lmy`?av*2-!Jxjp_Y|kv9qBOW0li=^C24k@LZw4^<@(LQ^ohr z5+P^gr9!@98!c5|(bjds>zgoc?@!Lkm-9>B@nUX_gNYwZ^{Lp>@^|b*AI^=gx?~ z>YA8mrxYTYE>z{ICVp}*q&&$)ZD610lY_Bz+r3Wc!mt*P;IckeEfgG0jwv6;9vGGd zT8&sSx#5gi=8H3Lq$P`h#h6qUfsk;p9r5mHbSM`zdTGo?B$@@Yq4lo6!8AvFCBLeV zuvoFQWX(NOiMdMnMmtJ;*?szfDfIPPKGfTg(nml?6N8Mm*8e3*wP8KzaeL-y^O>f9 zdeR}4?V#@{5^EQUJKkC!lTcF$ee=9bzBO^DIi$P;35K}_|8>^q`bj^=&B`Z4DTN9@ zrsV`BNk^caH@_;*yk_R9nJl#^x8Sh#&lc@#67#u7gRUy}zYSiy80x`fmk}&k3I;}?!hZ)3GH#-ZL34g0 ziXs}@5!1t8m)(U&eBqVv)CZgqgb#Fl7r{HZvP&HiQ9Tv;u)H$e=(;5+nQXPleJF8r)4Ej&Gcw{;fjN+yNMU0n=o;ZA@w)!%d{{^c ziBJ8O0iac@~es_yJvrq z3oyUgw^8P&6nMT4vO2ZW_?8?|DxW&Eug27r-Ex&+;|BM-U?#c)bPX8zu#_#bP>i03 zgDUifhhcrD%Kb$^lLk%*8XGNGq5E)4&$cpQ_ni0*)b#_ipzHH0oBJeGla!+;c3_fd zra3?a|GN~siLqix8atY0-^utFXm_w%+=-M$*}^^pR7arJGF37Nqo|nM{cj=uTsI+k z5onO(2hev~I&2&!&94kxGCI>KLHWTGd-Y?BB~$6uT}iXe9X@ z+zR=i?=vGZeyxk%4fi;2u5+OLF|%_KRk#tOo?R)<)iph&&)~KC%bZ!PB(%QK0;)tQ zYe(At(l%n;nU16G`JH=D%87XgO%y#7`hE4#ZB606xDsPM%dJBf1fXo-k*MZTuc@dpn2I6*YdaYRqtHks)TZ z>6+F%5INO}5TK^Kj(J#*cS4?J5YJ~{{4%THgQahTr)_dTO8O3uSOEhfrx507)+a(G zo6YMqZcghEYRi;bMNJk5qz>MzQuU0pR3ha1IQ~Bqx7aGf!p$aJZu<$w3M6EZP6E)D zdKZC4m{|s`H;^mbSW$1BZjM<%QB%%50(|I+sd5PH-Jnrv^Eb0>wxeb2Q}TkBXuPFT zXnd#0pgz2V^s+Y6-+UnYC4w}}AA^CCZSErU<|#YAwF(kgcOV<3t>K}+s=BcQi|j5} zi|Cm(Udy4@gjc}`j?OTLKdh(XOV}OU#|nU{^mWSaKa) zV)Ytm!z0TJEeCE&m$i@??mt3dow-5ThVBCI_Vx8C${3~6^8WGxpDsfC)k@9*+w<}) zl=R0V#YmfteH&=DhPutit+fWLOimZB=}VbOoO0wGg`6F!;Y%o7>H-jh^HH}jR%{C={LJ1^S( zJSf{)@cb85#q#TT6wL{?Ht7FR&vFc!esP&(+KF~@*+7p!fYx{)K-&ns1=EzQtx2ah zbX;|roq}Sn7Ynukm`-~pK`RX%aUBA>W*&wqhhdbp{b33DnW9D$W#1Vx<-=1ybGpiB?lWhz*qbZWlO!mTv^GB@li9{ebSv_0(#D82@%#39CNg;d@J1M`evrD07X zI2uybnosy)xq=JNH?*mK=;%rg{`9;!zO)EGlrQECoafEwo3TfZny>PB4Z9I^;=Q&yrB)u zqHY#nXS%MK;Aq`Xl>8R*P8I$0|N&J$I{?#f0F+=*%F z;kB*rug8osU3XkXR0LrT*=+AnVCEQh%eI3P+|$r4_{+ ziaZ8cMcqExjNx%)t35!q%Uk<^jSyszzdH-9ax>08VuDHBq(4l+Rv?3ogJnkhiM@u? z!v|LB4|^egz5*|JBAP+u%*xV)xa6T{;wJkrM0nM}1~OL#=_{0s>x)b5wypqlr5P<$ znY1qF6c4yur>5ik&urW1niqYjKtF8KWmQiete%8Ok{k)19A`9g?E4Ry9h0gDviUTd zPNIq~L(wf&8}$g9BnPx}T(obAW0sM!Iwf5_BPSdheuPJ%+jZV`By4=BwA;;ow?QSM@@KgN7v%k^1kiGTd z9~a3aWv0~=&M#_JOfMFR*cbHhD7QT#ekLFB#~6e>R2M44KV81G-qbWvK=5On0%cEs zju`9++RWsT%1H9jIB|NvMQW@z*H@SR4Bo|o73%41J`?hPtF_%4CjNuD7@X6(0`4(h zn@XiqDD`UP9$XUux2m9;8%9nHMjShTrtq9Ta6FO>@SpNC)UOtpb4r4;rhM%q<^3%n zKDQs!Gub_54eBlF3+-8PQ`ePSLoH@xr?{{E2ssUC;rdR!?*v6-Q=wN-7t}n=Ok%}q`WWxj=5;_YzyC^$(trA zExz@)OSEL9tG2=xhoFPzB#0}o=V{WtZI=(@~# z5g93HChMzm54#`t{^eZ0yvcdEx$3nu!qRTTO9Wwy;|~qJUF=}*r-;XcQQ~3__VDBq z4($9@xUVazv|i^SaXgP_l6Ep<0UGa-BIpW^e^oZDZvHqjH)3MOx!F0<&Jh-XLYo0v z+VkO9DxTT-M9nQ(!dq`Qv}}h9$(3n3zQ7ixPm;yUkz0`4Aun~U*ITfTqQg?M{B$dk zxBS*NEiwF&+Syv~0)pQgJt7n9hQD=@ARYyTd`tNlCTS~=QfbIP;3Ndx zPTd!rVJUVjmr7D>Fa4Wghw<)Wwh{^jGtjQnU=G+66^ekM)TgQ2qMhFQz*IToYRmWK z#t-7Wm=H|9HPxAt9{PQoWe{KpNJT)c50l;W11h}zGb0)iDdv~Z%fwOMd>_$ z9Sia`luL^aBe%|YAPl~&0OpCfxZx7PABrki%_>fNnf<=%8OpFY&rv)c%S4V;d3FPO z_CsDz#eZ^?GV<9JqL)_~p~Kq+|HiXlTeJA8#k}b0dPziiUE*zUjYp z;pSIXDgb|rA{gvC)4g(||9j%|7ghb?VwzUk37$qN4Vx3%L<{0l&0RSP7i5;vdv7&U zM|8$#sIJn#j+up9;^@DECa@d?H9Ch(_kZ4@U!T!7&3l%aByE zwRyq>Q{h!Ra+sDivH%(fAlUmN_7qdVn00$eQMok(rwH=HNBz7&_;wNQ; z6J~;dMwoVwy^B_CykBMwvR0n*I+2(JXNg%Qu|;+?pidf6Co(XLy7C^d8*c{D`b%Mw z)N5T^e0p5A%jvEjOG#%wtZVP#?VFEXyc|iE=ku5k4i49JV$N}LkRN!0b=RHKR5NY* z)=RGG6p*1_f~#&J_H-Dvjj%-)TTZX6$j&E=Y#aDJ?tRT5I?0d?R4<&sed2qAT zYC1`OZ*f?{>^J5`w(=Et-k~#F(Q922o$(~|$@iOKo@R7b4p9+c#%-GWMVY3sS9Nducq34rHUMf2#zx;NK`Ermb#x%R$76VSF_&tXdWnUYetoWauC(B_~cSxf$CUW z*FS9MI912M3B5)Q$Wd_y6N-Nk7vsV7)`jo1(XpF^fGEgMA~My^?wv>gpSpR`3_GSk znmATyaG)(1BBE_vtv;0t=g339cfUuhFr~T$NKX!zzxeVS_7?MX0A9-jvZ&z3?b-jQ zbN&$r3$RZgQ(^y}VnGChUUIn^Pjd!hftR4x7h=v&FMHO>=%X@!SrsmkcC7u!!A|Dk z&HBj3Xn=L3<=gD?qQ%>vrv4ZcnzWWVz;f54{WFTpRO?no7?fpG#bg*sB?L*{8(pE< zKIG6}NGZ29Y}wMXRVcQXF>Z% z&l>?Q7Bp==TQQb)JMLEiU}iXy*YqGv4$ROcNSm}}9hF2{HNnB`J+p!gt-!ey!ND0c zYFhgzxgVh>P}C${F|t&4;-v>Q07t`G*@!Ip4+njC$B z3BFC%Dt>WudA0G<83(cyU33KcpiX!zSabNf81!q3dVyq}iid#q=fP^%mIsUH80v(* z1QcDF+}MjLT4*JQ+^0ofs;nyXg>N75SOg90E-&ap6EQ>rrZPp1tb6{Y(gB%TT|nJ~ z#1ykZ!%99Q3&_WNxadAnop|@|Smf(67rMwL=@;wFE8jb7OWto|ELRdzxfy;Fg=%bv zSQ!#7>s1ga<3}RWLO7vhv8ujHmYoZvb}#%tI~HPKA6w-|QYy(QSl4C{Z_WG3 z-0psGAtFRHu&VZB-cGOu%!Ylv(WEE`U`_236TQsW7OG>Gq5Bdp)}0Gc;Im`_hqWX; zMVD7Ty$v=a!jzjgoffLInFhqj_M*hp%O|q`{t{Zs$|8v7G6Uupf)i+8kp?}%b}|)h zRN(%0#FLkx+`{(aKRny~dz1Sdo?tu8Cr2c*r+hoCCa2t90ll1p0e7uH?# zpn6|O{3A^7|9#B~nPV9Pt`$p|ZVIG1&fg%6AMm95WArhBS7_0W5ulcoT5NUX&U*rpV-GWS_;^Pa>HPF3ThF41MixP%j-g)&tsw! z(L2X*2Jh8GQt%`iZ?9_&{iLz!h2#6p)~ms5K_~I@o{65x#?i4hZMzB|Em0{ZXyE(= z!;YDJViwTSBLju%j)Xxg?L=8jfCAI;`t4Yg+O)@uhCrLf)yYb~dBd&G&XDFKPT>4$ z+_Jflnrf(u4YC&SH(o2xwQ`rYGAQkn=Tet6#`4W8T%-kg1g28O_OEux9}`{HkN+2Z z+>-q#`!Q#Z6Q9k3EVSW9075No8izQlBlWNQT%{6S+Rb6z)MaQRO-BEmCg`Kukl zD_M@`Y7;on8)`Dw-WphpgrGMD#pON$(fazTRrM_7zDfz74KAo2zJBdyv~;OuX;okJ z0jMp(l^k`RmJ+i-&`sA+Q7)Y#7Q-r5I14#)T)r zviZZly!(Y;L|&@hZx&MA7>(Mw1@+iI=isC@d-ncq$JD=2B3f1M?#QMwnnoJQjj9+z zY7?`*j!7slO(LzKf91G#|b9$F3Q(MnD`C-~v3JmzvTBxL|XVZ?<->={S}uph_kK44{V2(u?An)VI$L zv!AlGW#|-w34m)o!<>yZH9KMcdiaZ#TZM}cH#R;RAV60%1f^;U%3ZT;3qwM0?iolA zf5L>G->$5fMC`Y7T#uN2UYPAV>eCTMD!Yykw~7cMudWelcV3y~tUzSIvg9?8-8?PHjuo48Zq@hxKK1ln5`xQ=1-dmN7lZE7I^^|GEtqC>Ivw>!kJ=F0N$c6R7b zM3}AzQw=oPe*Z{!m&1ZB-gz`A1%YyT?v%A1>-qZRB0OZ_Pz^=y*{JOw9o2ceR(Fc` zc;bLq;aWiteSY=(y35n2g64N_@(G$W(87vd?v)RrW%5LMO!RiL($kO$-0OeER*>!J zU?jC55POW&=F@25Wx?xUbu2)qsNJG#b)~a{o8P7-@iW}4sx(3x=@BQ5m*gP| zej|Xi?(NwY$c>L9TUf>2o=0YciP{~g04eH%ho7lBs!*jLLRgF~b#lg#tadm8tMxC2 z_^qX|SsjhuNl82>8r6tT*57$mjjy<@@ZxM&Q4tKx<;|Eurc7cHtoqDAjIaaHt_(Mx z$s!JBLe3Xx@Ptv~jX&z;B!iJcUOZ^w(42h>5XEz~&*L4skGn1^(9o~JgOcdMM2~~N zJ_-v!TM@-Y5UCiH$AW+YG3j6LrPKQr#8S^|3WhIaOrxgCQ$GwJAe|hLJLfz*SzkIZ zR9&{d?;~*F_GAM(kZ7+h3gQ^+Gwv&?!9eG#<+!{ipHRrrQfX1xzPF}#5ftEFoazPQ zjf0@i&6+v9F;!H|@S+`Y6t4}}UKa$4pFu1C+b4kNf_pmekcoY=Cg}rqp=5#T#8w~# z2%(JnNUM)kqTp?D1)iw%4!i2-(V2knvTu4#&;TP0Q}= z!zmtQt#C(W|um`w>JqEY%F0ih&R8 ztxq)o-4vuw!O`F3R8t8sMK;8dmAl5n&Fh=#E%DZRC^h8U=2_}3QEK8@Mu#( z{Me<@laC^SLzf|1aL%#4VkvP!4> z=AuQThy?2_$l6j!0e)0|$|UZsAdetS0>d>loS^ENg3>xb)b7q`YKN_9PjEqo48J;q zJ4^1-`_}@1)19=#6c3)cZ(@ScE`(Z~Z|%yWkz@p`Uc@C{eufEQr7Z(>ww$3q4R^bH zpiVcFGNeO>IC{izBF-Y$6;B)+m8mgVVbR79)zZP7D&Pa=lDPl3H|}(RB1x| zx$CT}7-_CCEiy!4QW5p#vtZrWV??%G^it_}_6mrT){!nQ%s_8UXlBO%sN0Rca>N)Q2k@pZS;(K*{2 z(Sm^?c$DFXFVl97=7of?C! z5B*03v})uH1&8^jD}-$U2^m1}+hTvY|KL82dUX>0a_2fN&M<5 zRDh!~YXtOZIQm0re+(D+@#T*lW)#r_3esPT&>HH&_3N&NZ44gzZ@mAizzFEpP!`D@ zJc9F|25eBh6A;lBU%x;7<&f=wy%H2$HMo2Dmpx1X?(o#7Au~T@L<}n2)eQpDm%9{b zY`{OF8SJkvDYF^0W3%WOJCYg;TTZ<6+Sd@fU`Rp9FRZN7U}g2z2X zZLNnC7)a?hHs0Xr7V3Ot?>_q;_ojpvRUa0J~3;}EmQ{J5fPfil*5tgq2=BC z_>~s&KOj&-O2F+yLhO&%_HRe|3M|xwj%Cx74x+hk zn|h)}guwy$FG_w7O5KbN=~X>EN=;8PG=jX(i|7mYsQ;rqhNO2$FewLi4JLv##ZFE7xN0eUz3*~T zHPT3Ys!8TAj37bw@)*%F2`0%3J(kwlJ_QN_4z-^EKWmTS=7M{eASxlJZ+^((Z)J0+ z(!A-DE|Bnt);F80Z;A(frcK-_z^@5I|Jn2rkQ9eAx^89;6qfC_UG7M|U)FY+__Y_W zZFS?JZBhCrhgCF5Rnn*6b9x_|c8@g~%)WJ+iS&9UFZcND#{+p z>5ZzgWvxq-haQ#=$&k~Z*+o29^x=Hv(u=~^HSoR%Al3|AKv}+QPVW-3%S}f6 z9f+x!f2Equ&(u1s1iT_&7QK?S(FvHe!=8rYzy>wY)+xlwel(FbtF5kv`>GUXqgxDd zR%$yNx-z(Gxjpk=j!gZ6_Zqx!;MF(_W=Xy)lOO&&tK$lsPu0FM6~~dbhm3&kBw-i> z?pAJz2!9S>+!86aq~$|y{iq5EZ@@s}=eiIPcn15bQaJ_>hS{XnpMf%@^Q%9Q9>x5% zC5k2o`!;@67Fo&_Z|iWl?tPc%Yrs_Qynk`-Jn909&ADg6j$29Uw!=42?G1~j2R*n$ zS0nKY)VSt)6;Zv-oFuGh7f5s9LR1oYE~#H@7CZAx7_037J$WKgf!bYTw6eK+sna7Y z%+eI5j#h;UJ;ocq)a#^c&4gq(HlB++5nG&T3}1nJ5z-@%oQV+*##ipwsWWry{}J1+ zPA<=^XtIe&@Xy^~C%ibG!CtDDxc=S;9pjWf5Q#eDL}qxy88#?xnbW2W{U*5hS zmtuqBlZRI0bsKP={Ld(`wOAmsT+yVRR*L-6$DL^Fz*FaLI`K~TBbxJ(!%u%&U|Y6u z#)LD4@r)gBGXkPf3){tiH82XWJow=J2ixUa7qvbBf8!o!L$jH+O+ zb*0H6Eij9)D}_3)Ma6mvJ9x{#8fZ=GFGlRL+lV^!EW&OM4t=%@Nb1R7}F=*is6Z-otb~cHY{- zb!E^HSlkR}+T$mxB0iZlgL#v?)*6RrS%MV(XeWcw1#G_!E0mYDV~mTs5&)do6{UIru3V$213yhao;{v){GdakpV#cdE(WB&9)GcVRc zmM$;Wth+^_DEyvR#S))J5$pp6**8T&zfF*aJ)y4>~_4RUcm?0gH9$4BWm)g zD?DemC$r%+Yo@&+nDLNaLfVU=*ElrX-`}wW8r*o5c~pQmM+h&Ou`$8i7@VZ9X9(8U zaS*oAv&BAqyL)EzMLCULFQ%gyqgTBBsuN0W@oVS!I6o%xI=#F#RYwjF&t1W?dTG-?ocfcKFI8>wF_W$In7^R$gXzxH%qG zH#`{c(5Quq0)99#h*6G<$?SnYsYwt z9a~LOSkj6y98@hRkl>jO|K6vmr6OZk+4mY*VIFtZdbjr5bi53)t8mnWy-phlQQuY> zSr@iRrU>p9yo%5hxr|U5HlS$hyfypsq|?4h$h;?!#+F@f_jLdp1f!VJKI^HbkndQO1ue-cK}$lXw!JOa^xRX* z&5LsjytuQ`h+#L_QkRU2-WqEKItPo?O6CUL>XTyvFL)?{0?n$=QV7M1JC@R>49NBb zJ?hV|Ii#eiw-=|WjxK_31JTjeVo%^2H24j>K`c?Op==_I+i+*TO;3IK19i>Zc2qZuCK#%O)C7Ubi8ABF>9CX?8IRTk%t$& z;*y!ve1GrtWQKidq)3S!8A%eD((`+e!&53}n^`qMO(Ona`6VpaqALDp-C?2kkzsq| zH&s%y8xa><)O$!M0PwQo4p=MPEW+ zm$djruzv=+P8-I$sr`rW2`Nr*vwhDTR!KAFqwrMoL)WPLD6`*KEl&Zl8Asv9Oeb@1 zAgaT!*;Jvo;>Bs>EW#}{I~3!4d^t>DCb;%{2B&ne>}qVfMHQ|QI4mhrXcQ3y{{-0v z4$KRRa334H`d1fI`e~ac1)|%=!kk4LaO=CX z%yRA2bJOvzvT3a^iS0~cwgV27>Iy)GEvdk0i`EHkG6t3NWr2??t}n~>m-xH-g?4o& z6}2d@9&y88z7hV|4d94AEf=neQ6M0=L+6{Vy_%gyyd?Ny|2o;hHSbm2Tq)gb=5aJ& z+)x;LEkx&UgV?^K9!lUmXKoo#ZI0G+5jPQAQ4u!zZzf~q{S#z;?yCP$-{)4+S+E8e zYdfq)BQ`W<4o&7kFCaDF!|7!wV>fO;^Y*=aM&3ghr%P{mrcn75r6gZ)@B0B?O<4(EHh0r3NRmr~%`h*0IE`|2W)Wy#)fO40$P<4M_?? zrrZe*{VvLTi2)_qfs4t)-;i6E&*eEMQ^+yC9ixsWpZnXYxva9Nek#*53V-ht+efuV z!-mFULhlGw7x005O$%tn-ykK!g1Szn1F3K6&o63{{)8gQ3rzJyVNwC=)ovrEoCBG( z8%a{$FR(v5)R!8^*3P#9d|1_df{q_A9$@O0;-98|&iWH%$P41)`|&7p0kQ2Sy-hHy zlk8844^Q>{`fop4De+#Z)Z=<#iydyER$7!VtUHB0;q0xif1OVukMm|e#?*M=sqkK2 zwWzu$?tI(yOJ5im7~WAyoW^=*3@~(Ux`RrMd!$NGW#H)n*=0mIirAjQ%RB^Fb_1Uw ziTMTVdX0!41&m(F{OBy{+0&h!s^&@cqCkg#glgzjrW(D8)8m52hI4sm&@b^+To~c( z17eSjnmDI;JVPp^bTege!BHGa-j#nxP|8l+tc+GJ*mvFbtt&~dsTChGlxbRxqqAAO zQ51?ld-2w#{!Xf_A%vb)CW_t06g)K{UuTEE7|ud;$PkZ3gbd1*tSnX$MNSb1r74yb zVA=~TY9buN$0$tgp++-LGSxwQd~Cv&+z;pSB-Nxy-o1`o?bPjuJe@sB)0@y=L*?6dQe?GgBo~ z$oLd4iPZ8Vm3-p6o~y_HCaR^1kGt^4b#xSFMgd2b22C@Y!hsZ_6*1814dE70=e`_v zXqsf~l?ZL+;u}~br_WyA%g!Z4$F+Fx9-=qHfvObBeiG+p=OH?aWir<&mt1QEtVjd(u9CovWr#xq!Z*%j?#rg`E*iDqxIZ{1o$?64@ zk&58Rm!j?zTjs7SOVv6{ytcEO#W5s-xYaM@nt_+wVn@GGL&k4b6v-;Pj>22qlF`~w zl=dv-{u|wAGAiQp1Xz5EeBrk=;cNeH^^^{B0t2ZnZ>OBV6F!yh?8CjxBlgy{RKhY? zYW6M^QoQG{>}LPTH+jV#*~nv$a{M2&TePllR9(lpx4g78f3i`omWI=$$v=1yK*SYk0&@fHr3Me%a7eDSMTBI8#p5fx>+Mf zN;**`(P5SD#dhl9kPp#?T!*#6;+Q%umnHf(luw_VGvnJ!Iy54cN1mhC>VfixF-7%g zLuL~fLcf~d_Z<1uUx!4@x;ph>DDP9IOB0SG8TK4c4q?- ztIC(X;#-}^&^&=V#P$w18bhg(bZH|l&;uh=TtWX_pXHjyrjgYH;F za$oyg25FW5M^+R)Xc;ClxzO8AL%W3x$g~2YR!jowSbbCXa1ENN;mksuodP zBQo>jt>9j#jgF4zEe419_y?kce>aB`BTl==PtNVlsp# zuAlL3yq`hIsg`1MakB-tsc_ozF%NdK43noRdLT>`%JBK$VLEjuL`G%x(4*w}Bh!9* z+@sp()aZ$aMDva8sq$DR$25(L?WijIoMr9eNdqbvF=_!|RJ>chFoO1%c3#RwE~(Y}J-fuiF{??~hz{)0~7=CiGvz-d;@+N4;dy~ibIz+D1ipQT)zXx}5bKnRbYFyVG zEZYhHD?w(j@a=e}gw6X1Q+`JS_HDX}G%EPME4Fwc@6#pBQYO~8I6r81AyH7YLXst6 zx1JUVS-A?htGVhLHGRh^b)_?|q0crDf|RLfbAwe#*2DPe#c-BPy(Gb}t=*{7PS&_= zO%rL|GeLX|9Bk)4!TOyL!o*eF`hMO}|9;I=)|HjhukoAW>!L`mzJRnAYE^2BiZWBz zele{<9PNxTD2Z*1s$XzD9FeTaeBCJ~xG4urXP0+>LUj{}`7o zck^w4kcc);$2;e~WJ?2EQXNkwhB4EvObm9f10}PZYqbm-#1zg7#9(p-BNQG6=1+lZ z?Z?(csV(ut1+m!!^lb7lzsFwjPS)MY7U~lbsF$idL*AO=*3zH6=ZCBMkfh6T_OUFQ zEiv6S6e@HYk<;4B zeEB?v)21o%-qkTBDYJVLz%$fY%6*K0--bANRuWgwG4NgJ1h)Q`F}5?62=Hb*y8rJw zX(-1S{!z`!UruxZ;tCnSA%VtcZK-3Y2UN*n*&?5pkrSM7JuH=_}QqFskn z4z#5?s{DxrHz#3|pk<++)IujsIsuvZI6~~nLIC`=<(1(jJ=XmLL)ap3>WYp6Y*#(! zaG+&cKTisywHL(ik!cfNf5WoLIOv@>skpM-@Vo{6N>lzx{V|0jus2iUit236 z2D3=%#^evDzN487b5Yx__}3!pJ-8*Ure3$MwA=fJl5!2}E{*OjfoE$hg20-poeS;J z9snqaGcw`vf#v@c1`aI!Aj^(BOR8?FfJsLUc4&)$zJz{^8FLy7g)xi9o854Eu4+Gs;I_mRBvWv zcSlC7Tw~8so|L;7-}?9Zx<9g!F|M{9#>_C)AVLGa&K#CWf<_Cc{LTIzN^96L#i2W= zyHW`VI#TeLbd~9k8E5UrIzbBT%TkgWSTn_9`}V)%Iu~KWQ z9oCaG9WCT^-tHkx-T7H)@>VuGjb~18e4t{9!ra!UwaV;k^mNTP(N}E$JoYM*3J!#B zBqcZTME_i~iCKBM-hO9GBD`M+hcynzc zJCBwIP4hA=d>q2xm9Vz&3dS3Wpc;^dIClIs+x<38*|v=+H~05UBS%GKpDw#-VU}#g zcP9Kav=JTE4RMk5v3aBCw%-I$Duw*}{ECa(ZV(xH#j&B%?%WPwxeVWv+TAD2OC9>{ z4P@q<>axdv5@<{#nn;q5m1Vz1R#M!(bHdGYKjqYBgM^9C@~iw|^BehP;-Tqn zG1|N7rX~;~AvgJ{(dL@PsO$IvUV~Ge3rPdv6e3U5Dx(=lBu>v#Z_Psv6%%HfT#(2J zjpKX#>SNkrgaWSRA;LckzE&(4L$+9CcD?b7pc(}3J9Sc86cBDcyfSSY2{}l%nBS(B zCf!{7vD}=vqqB}Ej3ICUA{sZD&xOg{ltM$+H2yA_q?P4d1&4xiIEtiNM+{BRB};_V zwa|R82foA@Pr?Cz(OuTN81>P1NF+XHkf$AyRfR}_teAO&b(uC|Q8syCuB>!wgv#5T z>8hM!WE}#{bFbULcKFq1euQElDCNmlcY`ZVatLR{64w&nkBx63%Fk+hdbb?Gg@iAL z4YfwjTvPI?aQ^n3hqj6+>-AxqvhYEX=G`&^j$^`Vir7_WNRSn#w+vWZ_V$8GbXHf2j^3APh{&h5 zR>jSVVuA)PWAp`w_cxj8f8}$THPFF7lfuOLKRe9c%Ne98Mr%B@j5Bnd_{*u;r8fby zAslDpQE{AytM(1F#d`bxdTYM_l_;KZO{p=p_No`>rx^*ZYONJ(XI|lp_zZL2A9z4G z4jwtrH)zOSv`&jVF0qSpS&fGvihj0cJ{(^0fGCS~m#xFG=Zim{!)5k*RIJ|1acf-k zN~^u}TBEy_zh{WV`&!_%!A9u(o)^NtdKy|#__*Ni6`W~I_avh7PSqwn`vs&55HtCY zI0Nf{!WkI;nIhcOM(`8#SdjwM7T z9UEW8Y_vP@r@>BxOgh~ZPHc+7$vBO4B2y9=Jn{QvqhTmUg0R61Qgq0!HFK7(hyr2Jm(tUSAM>f)gJeUb%@J zB758J%J0iuK0EC97d-&Tp~e=$eg$Ocz?j{^qj_5u({X=1@q%Kq2~Jk}ZS z6x?vy0bvBzKb&u`XB{gJGy;!<$6StJ-&YD)f{=pgYt!sFbWpoLhy;n?H*GQ*V4oow z&E^Lyg{hq6ubJ)FuB(82WT@Y%a1sLn9#Ha+DNUPQ{QD%pLH)04P{Bi!;`=vA$f4%fp0n;o^ap6U5$Tq7mz<0()^E%J%Avg2LS@$9)-~x;9qg!T=Vd(k=jZpm)7>&_$1Y_oMDm(2GA>g8PtViz@-V0YT<|o1+tb z9k1ZeE~5GPVE?}9-EfLfR5@uxmk>&_gyfw33fs`n3VAx4*Xianpqd=faCR~dnyl}> zPJQY__Xgq7+nO5G@LkW*F)S0GIeG(zEUI%C5sSUDTg$%c;1JfgQMhi9xnBO9!qPr-7B0uJ`x^pM zt1y6SJb8r)nHJ7x2Qce%GAo1{%O=j%wG#VTE6=+wmPI(LLaxUv;Jgn^&$>fAYjvwK zA@U#+E|szmk((=nMXH1vSuXGUxU_eL6B1uquj5CIHy*yelZOf2!-QukqBsQHnU!xP z)JfOws>~j59tXnpcV{u#ZdyDc(80HkSXEjy0g9D0*!7Y)vO*!LIc32OMr#d!0aLLQ zr@)ZDa-e%Rnr474dNx|D%Rp7xPEM&RSORJIJ@9Kb(HOGUZ<6&+;>S3=_kqJg#MB1v zYI?5|pGpfBi{HOH2@JBc9yuU95U2)^eF_1yj<>I4{~V0cTpUPyqK&?6r``e zq=dx!rV`Uv2k8h;FLG?$G|69@U(dU*wF_P%I$Pf`KArUoyyKzI6Rsa zwQ3L1VC7)09s7mI@#j2~cN*oRw%ebzPgO?TDJ*rvytLwumquWnqFF}c8&{NNPePVc z-eMianjKpxINI;sK!zBmUtdr^L%k06rvAIoZ9GAAQQDV%5v%LfF@WOwdk%r#pc#0 zQWJQ;1o(A2C1En_+ZbN35T-51DS17|a1a!_h;oG9F)q41X_x3Jei@FPzlON*D3{pn z{H!c(T2UR5smvAbm~EryUfVpA(g;8t+IRiwm?sX38FOCN-E<`%)zHwuVg1VTuZ%K0 z*+d)(Ur}h>WO`T-<(H=!yc90KMT zXQ_&ztYs7V$5hvB_oyVT4#n*(L4P{H%5@<`E1r%-mqoXQ3zhVXZK1k1|)5;#Ezu!+E!+}jISKu)O<`w{j0ijVY@{ltiI-84R0iH@tUoZEzp4AJa(C> z)4MZ=|Fwl#<8rjYxn+dM8!;vv5waXlP7{E%EkPfvln@M-8w8Hd}_ywpVCGV|ZgiwEyM?$t)&8+Ojz{y^V?)fb6DK1H(211`oZzj>`9K2-n1RfyGY(z;<{HiSjNNKj9{3NZ{$gK5L)l3kekOS9U@Yqcj- zLJpSfLT5Rg7ry%HsU(DNolU{Tjp9EkDcK*X-TIm-6P3hE?)lYvqW`u@=f!8?dk=pO;IIa+>&q?b~TQk&C-_GN`H%; z(9$PEOpw#m*@f|EhqR@~)e(!Ug@9Yt%$Ii!>~NbLA{UzQ!n$N1~! zR6{-ifY&ZPQ4i3x6|P=Y?ulmBU$$Wv$^Le6YwwgLl-qXOySfsKOmTD|Y*?N7#){9e zMublA2Q6NSca3?vDA)^CE}%Bz&2l_)Eo;K7S1-Y=p}gx{ymz+P^yTb=Xw2Old7lid=5Vhv#AIy-Hu8(>t&a_7^t zOG^5xpR3dX5|m#Qvm29-T-lN^iiwu7j8t%dmw_-(`;Qgk%^NjG576l!RBetH4^G>f z-Yu=g1sfIHOQXLup5lXgq1Ben(8n#ZNu(y|&d<9*i}FR>CTzu+@ts-dHZiYrJ)%Z2iw z2_?BStzYX;?2pkiT6$M(caaj(M$35i$YVDT^jksHTWlQ4+lJ|aMe?*bSYHQchQ5^N z@vE7>-n{~_g*)>VMl{Qa{bY-Z`q!pn7Q2T|U~xYfUSAW1XSw{hGp5Ck#>eZ@9jMT$ zV`lJHbWEZ0nqoN+2xkxC4oeHpMMXL(sZ-s%hzftn0t)+AHqm0(mibl){Nla1>yN{d zNFQEN%gPyaqm_5pvRhA!67cYreEHBlX+M?C*08-io;jxgbcvq%9z#;Brr?8k($HMx zwCRyE4(jlurcmg`JI%3uUwk{vMy<>4{6w2nxc}qq#Qq;3`2oj0_A6|DOeiq8GEUb~bS&pck_?a5fP!F|so@f#TzXa&mSwF|dJh-|%sD`Lks8 z$VV#SModGvO`5aN>^uqtP19UQ6GK2iN&u^rm`Ehi8te>7K`0UCOnhy}d&&#G`|73B zYxVoS#r!zsGdqR+nT}UBNoob%3`Q-av#;&F)ny34kq3_hhp=}t?D_Qv4-BlIP+_%{ zfa4EL-{|Zh`Pks>Zf+Fs8Y?r~j3o_}v3E&|4l4BFaApALyEp^&Ws# z9q$lo)Tx^{AVPABg1VWWKkXV^{mkOJ2J#UQ zSlv(Y82;3Sv zxX%U$z&@S)&91Shk{06x#sL&KA1{8F7SR6w{^2K1eiqR1@CfSV4glhNv=}l(*cxF2 z=0};RKuFFXN#WZs#9s%Y`;#1hY!K`U3OxKP$fn;9`|Z~VpmXEL4jWQBuo89&?Z6U#4;=~2U!NhK9*y1~J|Gz2#~T1bs1qLGDu^OAY!ekqoCdJX zV;~Rk>MujpE;AAu(B0S%+jmSbAdlng8Kl4X4_*X-d+rXgB0$_g?-?Y$zxX}gJ)nE? z4I;n4_&XjXfV;{KVxZ179^u;Z?Z0sNFR=bsxYQ#F)Cb=o2I+j^6{@@3`WJ3^kwEUw zwuyt$zP*Cy4DI6(G+}NLg`(zph0Ga$&?AVN(zl3*xaN8#0P5k64no(c35LRd>mTlk z%MiSP0@vJTTK4>|1HXEw?HOPW_MP((5(Yl-2!*Ny+2rtM2;jrKs0#pB7=kfj+`u;b zZ?A!VHw^r8GW~GFp{##Ig&?4?%a{$>e=9}qT8D>^dlGlef==U*+!2#sClIj{z`yih z27145atTg9bqR(DT8f#+j^k*;9j|U035c!;bp49HuR}cte*XAF)c2ALzFqt6n(y%o zBW&Di5r?PO2i0Z)uRX^>1j9ani-fy<0TYp(J%Nj`oc2H%h@fZt?SjAhictTSg~KD- z%aaC=9Y?l_-(>m!b$xcO|MBr!`z4HkpQk(PHvhMPz^{CJLkQ{E?nK0~CBRsF?hU0K zd&R%>i_=6<#5DvK`ujSFEW$EBz5dt(0Vp!L#hY(mSKa)GUj%W9?{h3H(W^)FgdNcR zV_u0sv;}Hu1*$=0ORH#@SDzFz|hA26bBlPll$6<)_?x~Y57tY zFz|B)XDFikI{eQR2YT=Shxp_Otl^y*ZeHz{Uyd+v`V>Aq{_qoAr0Bkr9!zi_JoKCP zy0_Mn0O9~@_0i??wg276?KkB8XQaa(V+qn4qCSNC3$p-F2uBKES=Ux~NaNri&VD-i z_1gpL=%|42M@Kk>9nv=U7L4FP^z}9SLp?Ks9E!pBRojYj|Mx5CnjpLs0p^O5XiOon_7u^35{f^ zGP{9%2MF7)9m-CNmvv_N4Zy$q7^fglWG3$fjhO$z-3*JXxt>%X zMy(X|xePlM@z&&V86nV7u$f`aLhW2Ylo9ChJ3MZw9}bS}bz2$$XGBWE{942-mv=uF zCm)2NBVeJNL}@PRmo-H-WIC({&k^JuiU%4#lwMZUeHsQ)sehHsdU0kJn)M=_$>ASZ z8ZOWQZ5Xq)SBhf2!=`KZRCLoTKs()1w7p@-j&Go)v-~x#Jjv(pQK#W)A%PhG3MNSk zXDQ@1T=SeC!LS+^PK&A10yc^`biOCe77y?r>pt;SpEhtnb|LfR{IiiLSbAi5nNlVF zW7$VpiRz`MZMQ}SY2nZrI8ZaY6M$>OeWG$4v}LtPHhrHY(s-<^Xb_y+paCJK(0Sgu zk^|&*7uPv9QSxTdkX%yP-6T~TfV+{BM>>b@;rRzRqvQxK^l9dCS-e#xEwwNiB9vzh zoyeeXNF8`DIEn)&Ve~Fr*n@^=T3Y#*B*4#VItyEM7cFdb;h}I59E$QUX%H-=&AKzY zA6a)!b?HsYC^8k?`6u-K5D?w%^M@*IV#tb^z9Wf0&0AZq$R?+_%NcVC5b1;JD?L8% zR5N!^__DM(Lkqr^!#FSp4k42rf1t>JjY7oNH_(At68=~;@8mKX+c`Bdy4|3?FPJxn zDc4=W65OoGW-~e4Iu{%S_)M6U%;nS<&qrZBmQutGY7+hgsX{Tqf;G$ia6hB)jZU*$ zQ3qxJ=_2#a+Bbow37%qiSmvn*mtwh0L53TjECT$Kd!X#J*QN1A6b6t{ZHzxXDfeB8 zILVW)a;}Oz7bAZb@JE;jkRIx(_)i!&C-#Hz;HBKpRy&fb*3BjzGW6ZNy z;0dW02!n%fI(r+*rXLYCG2`7b3s|a)(wRs7(L}*U8Kru-)c%%S4@-D1$)HKO&TW4& zp#_snRju%Imt@Q57?IvE1#R&~5( zRDyAUvesims=joub|LdHJp#SoXkvCUYd{p-u8?lL-t#{?;`4I8z|L(Fm<4ggu@@uU zl*wnqxs;zWo8HoX-s!)zeIt4b-0v*1x9DNn-b@4+8s;92=mC^v{)mz;d8gHRxRX`m zvJP+8^A!cO)#FQtfkwMWdh$soR1AjBajsW(?RS$p)uAnF(!MN_X|y9d3>*WOF;a;g zqRl?kr06zgAJqIHy~xahKN@;eq7!M6U&UKDjb8kV;g^`8$t*DeOdzvHABeN30Q+=X zR*$UkGTXsHVv>kN-9%QFgU>%~C5)S#=k2wkK@G&9Dm9d4iAO;#5?T$RpcxSE9L}Q0Y0sj!d%d z`3rFrI+CkSk+6hFfiPt9M5Ryvt!sgKdKr}`rIYEG2HS;+fAL;93H#=GuUESARF|v? zEA%@?O0N29K61Vb7Sw!h0QizI<^Km&wa>txLXBa2v8SckrHE*p%kY*5Slt zO_uECs!y1LCJCg-DQIY(3b{-M)E|MYf!2U|{Q{T08K& z$-?#pvZ=Eb^=+;Bbus^Sabu);qUqL(Mr@+``RlgkNlQE+JSGcGKP)zYDg!58vUjU{ zvR7Uwhi2<1hT9rP4|6x_JR)lzl(`9Vc3at7k7IRhM5!-2Rh5I6;5lbO zje*&-`!r|Ez#bHv1(`e8PPn9A>DTX*k`Ub02CfMw0(BqH;NJV%T*?1q1g1p|d*7A` zh1KyzE_3>KYpf--$4~`o(0b;49w?=1K-5P1Ht4OZTnQ*pu*q^s~#HT zXUa_&*)d|g?)Ax31dhsd^GLk{CPH_+fZys|Pdb31UwoCAu=4AU08q|Ew1tN3JLQsY z9P}#AgCkYMjP#F;4DFUpG%`UmP-PR4=ggvgYyVMQ zxDTk2cLY7xS0N3*D7{EXug3y;Nc$*BZMw6CrZbCr^oamTrjWJ`2A?dW?kv`Fv2rg* z>!VbPTQ31b*y%amnHfi}(HLifk5tSFaVRIGbR`ZL9!pNoWuG};#xxaT;6*)t;dqXu zbG-YK;3X~aCVZ(&cd6p8gKZQ_)$#~n8hB}3BS7(@I1~SvA<=O>T~9aaXHRQPLqUS= zqjY+FtmbwN+@u| z3#6AiE@uv0jyoAap6;EucL@iNujnOioAcAqPsTL5hm`G>#swi)8|Z;!jZ8i$mD@p( zFryU1t%`+d-9d8Kzfv3E<2uP4!?3p7&`iiKhaPj~D!g~d6^H9mG=K+3i`(kXrxDmR zU9L~KBkdBJAX(y7>-p43yEcZEk^EtC!ErEqX(1%i1kAqUscJc9G~W{6YV+OGa>Pi$df z**Yvn$j&F20M+8lcru!rSSBSU-}lo2t8d7VR>vN%fUnp($^IkcJF;BPMOi8X0rhk~ z7za^#IL09-PNGMl{Bib2Q6Z=ze0uvBEu>UX8rzX@mZt-5IOCiiuc;lJrUEoI?BD0h z&lcB*YHYWM8Lu!BGIO!iuz z*xqAx{)SehxiK*cG#8cZsVH#_77e1;QK#Hf$8XsRTqp959q0+U(tt=f7mK`bX$N(% zpZvv#OhTO?V5c5YRIoRA*8!m+Nzt0%=1*nZ_f`~64YQ`PYJc;I)S6nUCH@B|;i6ssfc zIBeM`yP6}$>tcT9PvuO-d-f6i5Kr#a++G5+gRY?IxFo;%E*n*?*3Wtwce9&08|fSn zVNaalZ_w3pH(V)G4f8TxS7rUEh#w6T@XwOR?wY5Y6?C}FF&QXGg2_Y##P2OSoV2Sy z4%5A=(~f?GBMB=d`*vHU(W%-)ms~=Jqm*i)Tg$xhX?*%B%qdD6@kO!?X(vtZ^BUD@ zAe2hkj?hI>w(Htr@p&x$ho5A%AiFnO;$~P;=J*Ix6*F<4qs1? zI}`GN%IAYOQP7u~^jM_CW}_aa35;4#7a|U79{kQGHeFWK8W3Aip^5rpa}aW0_3;Jy z0f0A@rEt+r58GL9>fYX>#XR;vFsA!_;r)pW+PB3a>t(b(X{5a7MS zWR&gi()99dZg#Wq*~ih3$hk>kRU`ed@rLFBogroKI1hd1VSjL zU`v1n%gY2Nr5f3}NCje)wz81+QktmiNf*M-zWJzNMBXPZeSS8}ggRKoeAtfqP3`p_ ziF3Qjp@p9^@sr1~=}a1vUTwT!O|ZY(t5X5n8jU${Qt;V7a9M2eeJO#XDbsBMLQ;!% z)qm3L{`B5O=fiUnVt8`1t1gjoK0jvhW}8SoW@FlcdK5iHTUl8=zfi9`uK$?Wq>E6D zeFjktbOWp#iaBmj>s||gi!EJ>846DVGBMiM`M4$zN~+|cV#AyMPzq0eT0z<6rbUR` z{qkZyXG5TfEbi#k@m_8ZO{H*xJx|60$BgrdRD#aleJ6Fgk&+)Fhy&z(sv~-E<#rYL zPc*o2yp&=+vDd4Og+XzBZ=^}8df^G=%ApZp`A@czkCW?2AGc|kNn3;*j?|{1rUBe_ zy~+Mky>?u9)dlr&wUvVZZq|3h7DkG-R45Z`ITD`O`HzALJsDJKoD{Tl|H7TYCF6+%Mm0?$LX2h)5OR}$J%KnY0 zuNykpGEdaMw2xb^;Su4;SQN@D2s}#$U87#+3FvohS@e|`g{d5|-2{Jq=e<@VMMpKv zpeyObv+u5xSyw%mM46}0gA*`wEv|&KZ8=BR!|(h@QE!TB5(-uOn`>>LN<92y_nyI> zOhmPKt>8zu=3MN3tAn+#AWvrhIasSHfMYrNm85E|jPVyFHIrJd2|0K6Q&^mmydqhJ z?+)_o0GUjy^YXlgAa?t_8^zluC0=CA+g{KZfp?y{pC3-eUl7_G+lEMee+$SsuddbP z&ran@@)kAFA9e?DpMu(a_@y<@)OHk6!;+G-{xYIDGu7XGNKXw(gPN%lPlvNtrHfHt zKKCBuZyeZ*SRuAT7MZ#JD~>FbJ9P@E&9gzGPspZp$vC*MeD>W(M(nQ?Q?K6wA{&37 zPu`MXT?vXpSl6^_cmg8(j9#H@H8@LbWp6cryE0#y~soCz(%K)z_lEQj? zcyjT3VSR&n%uF+dFWv|J^FC{N&2{_W`2d_@{=K zxk9%A4QVZU!Afpamf^*RsTQq4O2f0Vif=lWrgEI6*VZ~N;v0}doTNh|>WS#49Z~$v zOSY+Ynr4DoED0C8dwZM82fLVPKR07!dC3j^nsftv==GGO}BaWm6BuguEI=4J ztV<(S#nyqNzT9rMXOaX*%``8gfC0#QFlAh2vXN@u$3}{k@cZTwS4_y*S*r$pdp70 zOywhxs&AGVj34&^Po&(M@R-TJ##6CrH3pPTXQEnT9UloSo^ zHs%m8?XKFRuQ z6c3bB3RFoQii$tCl==!OB(p7|Hk6K!m0RNA{V^ncdkT8k3B0AuM$LF+FFSIVMA=t!4HERH0E5HQn_M7@ zT+2A-JpbQmf+cwgd{Ec#3kr-bg$hRUqjEi8+T*jz#IjGO$1mm13!&s`(h@|8n&Q+q z092Y*>7PjZnUaHK<5mB%tEZ#!D+WjbJ4&NmCOVamK}M!s_=^lW>;!eOiA{$Q5Iqv8i#DrZ`I z`^eQ3+9*9gW`w+iFy%($d5IhR#VJvZS8iM(y=SheUj{r&dhzc=FmaUTT04;J#ADyE zGz&>j+cTuI1>A>McpqY#V6*TeL-1muf-hLLkH@N%)*@|^whRO?rN(G_X*<|=lOIbx zOEMsU9+TBkZ~o z-dp?>C`n=G>2OEY+n}xzAmfpqEvFy1Vl&h0L9Pg1tb*?yOC*#MmXYq_LX^2Jfqp*F9HNO$%1~iDugAQ+NRbS z;{1P}boMt#?du00T;f)89OxCJ!B#0D<|DZhm)mwtt z)jAiq0R@+NM#ndzH_>F;&TaJFQ42Nk3wKTpO08SGLiedYSRhXlX6qckC+-;$@La#B zN9_46J8tTXd+4`%YP70{c0uXS&!GH za?vlg$hP)PBK^jdow5RFjLo(x)#fi`QLStJJ_fJDce0CLVA*Kj6v4PQ>cuL)x6Qzs z1WGR@b-Vwoix?Ip5yT+7hK*QPP1Yk96%bAb1FsCPos1Xwgrzi2uHCz~(jB+h1I~!) zMMh{EwV`622a)w>UA^xb$xmz=c4$f~H7{K2Y{!%Ff)_ZFK8p#;Tb>bV$b?iB6LSw~ z+X;90%))YO%(1yqm5tq^G1`c~Fst6DczY(!p^6a+F%DaSBJ#U`nSI~kamzPBf!^aL zqh~0AmTg=&n|Jki&HOAF9dc(4q_cEI2G?{uE1{8&Sk3IF zK8p3I8FUlM+U$F&04#`;*l!?!`-mYZ^_A5w!Yy|*_wEuQ9K;(Xjc1>G3G89gd#^4V z&Yw11-1bYv_cguTY*&==@i4u3iH4Py-Lgf}SVBxRnp6B;EU&L;>a?^u{a`$l5Gor| z6RSmnlJEw%@iaGKpy4G|#}hqj-kUn63dajCA{`-)aZ|{l@}9H`NUA{<4)#Rb&X{hL zcp65LlfJXaPT=|goTl74FcqHZBU68+vXgm@8-!!f7%Lw}W3p4SF#<AL%>+Y438_b04*EiCr61x+24j!ee@&poqA7pgvb%$?hYipwx;3w#Dn zfhaE2D^i{E**StpFV)+_U8WVtz*lj{`tLs4gyk9f9IY-Y7SZRXNn;Y;Wk0wc4)bg1 zTJ%fgTr~H&9e$6mhR?3->8HwY_lcA)ae*_qOEGv@Q0m!IeDCZt>TddL401{-HyExm z5NO{BUH$?~2Un-6`5Zq)ZdUY|$`zV96aVS^t2+r%Kk8`zIMl7K?_zf2vkgg2$I{#+gij#Wn0#Clo|mHF|^Y zTV8D*Sl)CTtU}`o{+>dosl_6+RBB`ATJcc|8B{xc7QcH+oomJ<04-(t=Wpf-AF$t{ zKfxY{u`ubGT?vDeiI4S|F9E^|b9u~hmoSzyqf4)*n1^$2I4NOe8+#-r^TybO!8zs( zjg4sKDR|e(DBkBCdVLk?_XVr9xMAb;&(#Z;#>?9!8~f9D+tW2JFze``mquNpg&OCH zPbzOYt0L)%^ZRZb7JP+Qv@Gev3t-Dk;ps2s#&S9{E9T%I5)Duz9fy|7dU;_%(JQgk zteC`lN)+J=N!pLP8YSdTC2I7xV#yr3ex^_nBV>thw=-nDe$N`Rxt(EzGPvY7tV>Vf z&&t5&H`58gJo-DxM#Tgtixh#P3iA>Aj03OWfY#QPp+8<22+=!1H!VXi;dfSm15QW} zJPhhdUs$JLU9kZ9jaFmRe{`SfQd}Fguge18nT4+X{ERf3$h+ z1gVWKvljC5WBivIzK2HKcR1T!R3!%IJK5&(Oa9cEGv1h>#?Y| zvs6;(na=eUv;&RoAD-#QJ)V^|tanMTlYdq-JIKji&v@THS%-=2CAu*+%Wm>mt)K>@ z8Z2t0xa(H>a<Gpv;mmJFHny0AgK8Cs8h2xtJ`1T0f(ULGfs_z+@B6g)>(o4}FCf zuVOpLrIxrnyu6Yt+@`UdSTM2miAjShEarz>v7O07M8tu+fOj)qsE5!t^g7@FsIjW| z7RiE`Y*5xrbSEq>dp^<_E8_|8j83O`Vwgr0!J}iOS(XrKy@>i!G=cs;c_RAwamhCz z2&PJMMfPcLQ6flOap(42IHb!OG!MD!!(E-NqFF{X5Wge>&1t340Y>&z?6|X((mP+x zJo&!zE?Y-}dNv}NG+!+5J*=&FA9BMHbHm8)S(eyUk`r4t`49G?4WbCY4|<8C=Qn%e zFF$?pEjwm|>&On+W)!edekBV_u;Z*7JM@dNz{dC9STQa>8Dc9YLUNzya3X15)<LLv=iXqp^;#6I>OZi1ZDmM z6`uDR?iV2fC{)yywlfq%-RZiICvFT8nxLzbDyB+$^}G+pK`Xx^wP%*a<;#~h&EobN zmt!?F>1W=>4sU=pYEulP#7aktuHR9tC3Aoh1nC>CROdyawUk}r;uJ*BAIDTzqL@C* zYk9qwXXFrnKj8z7YFBMS5_B6kBPl9hi~xsfwK(GD+U8*+jWIuk!z|0B6Ge}5ktg#J zyA~DV)4`^+@w-11ovX@DXO(V>L&wo>m>L@*<#doW6Z(bttB7!C-GaWe4A(||&i9gh^TOxt# z&;&);tXFKx)D7>GtIFj4^w;Z3rRZZ zYIm>XE@qO3aaya44R+N)hW$ZkLrsl@fR>8#*+u7{yI3Y<@UmfT$`{4~@D%CS9ssDVpDqm*X)TEpt1249m;h`(Kd;g6zG z_<6KRr%H&YOBllU{2C@y#We1kXqqN`-jkuyMm|L1b_gfVU)`^hS9E{k1V@{Tt#>^$ z2lhg1@EQp-R%Atu<;SCqY&p`OkUu+5U`>Xo>;8b$wii`T*V&*#8< z&UuIr+HaDwr!$~O64=zmlK%u?zR>i%)SU=Jy~qP{4rO47QfjO6li-nv_YX-BZ3#NO zXVDm+bLu4bW%-bw-&O#(-Oo)S12yEeSurVis`N!i%stJZ@OW2gws9xF`u#rE);Fm8 zbmn_fVKGV=Olm4?i!G{n)%^1;RbXxdH>dHZL3A9&@%!~-fjvDBv>(}f$04<|aQT%! z#XQI5MeG^(D(CCP7bMMFl)q4F^nH%r$NI$-9>U{?hv!IyUy6K zCQBEU?yjfrj$69fc8XAcNvC%lnqiCX&_xmz>*@giOtAtPvb}1qBL^p*16_Jr@XKPV zCx}?cyAl_1?~omvAhf`?+QF?@lG+uPw+>$zj`%7`*R0|$iuQ{DT_LT>8RB|4Go6>O zu?WOWY3dJa*2OP)4nZ@~e+2S4{{xW6$jSLX2;M&+kBRett~UK|Adi!o^Z(w>nr5P+ zy}3}6u!pn-90LY%b0c@BFNkfvWwAwyK)}(j6R2emiMFK!)KA#fxihnKYTYo)KJvZ% zy;P;~tTx?l86zrNQ#C?iX=nzL*w6^d+`v?S2iR9-tIyz{69Jl$skwy+0;09HE(Op} zzz0B$%}fo>j13J94FC~}fPWO%05l{k+`kTK{<0Yq5(C^fGCkcNFf{_iP|pAc94%mq z)-pELdpNm~xdHg6{ih|1WAoQ-8uaK4L=xz42uU%pfKuk#x@IS^j6g}e&&J`*?pc6p$ij0QOfR5ElxaaQP6J;xHA*jdLSUruL<(pE?CPihCmD1?h9x&Y`Hv+eh=2Hd-z_i^g&^*D9EIhS!7G%EQP6mNC z^1s3p{JlUE1wS%L=LNH1LnSXV$!Diops~6inS^W1zp(lh=1vIm6~;k;=`W`rUl@|K z+z2i5cb-{LJKBFlO>RYi{L!zfDn1O_(DiE&Ai?Yif(1+?NT%N}o%7eo_3QHC7dhqG zt`QaDi{4N7#qa935paS0&@UXBXnt)5%hB(*JovD6c;uwLWmg`!aU35)64Emk;2iNx z53|j;mYV~(`gaYeeEZ1*S|qDHWD=jzmwuD;cOC>SJZc>u0`Yl^8BT(FYWsRxu*J_^ zz#7euKqTcDAA*ynk{?0oIq!miw%$WbO`?4^fs;_nh7frVADEjYsk$*{{`Pd|3Ldm7 zzTrBTRmgDTyFMxfRjKg%k%=UXcMj3`vsU;}|2yt^S9}DJas=f$j2kv%r1!Idtp>If*Uz>>nTnA#_wr|kQnb{Ba>XX zeqB59SzKW-3Ycs2rx7qo=;Pyc(2?^GuS!nzHO}u9+>wa(kATFh_HWx~{9ju?0+Py4 ze2DX^(MD4V68QMTU8o;k>68GpmOZzd7XpCENBi$6jbBsNy22b(iNygB>z~pnAcO~) z_VYT1dVv}~=)G6^$=mtQIKaQJeqk-?={Z^C#N-Usy|yI+RjZ6K$L@yF#3CJ?cS;rPX zXoRAk1A)mv&Q|a4&PAdjrM6C71 zOxVYAFgl|=k%}JA3ks(pGnX9G8K3Z5Iaj?Ctq*vbIlkSe+rVo8J=%uxDlUbn>%&SH`IKH7+poM(4@I%9OHed>9six)`oF*2=;W;MRpf} z>Qc7|hszXrX#jg~c&hw8QNX#ZFkkKg+$d&jE09C|xaex~)wD0iKDnLIbX(sKnVx+m zvhA04-C~H1z8g5&2J)lzPq{JK-zH<*-PyG`_(btEFV%yxkveT@de0Bm{~)fW{85M# z!7cpBm?a*4k9N_Gbawi)5)v!HGg$$CSl7qJ*!{w8O6JSZIl_7R)s0~ub1OcSee8L~ zv~yFbZuy2U7UknV`iTbcGOT@b-k+TIwu}q=7&Fi54499;4$UqS;^o?kGjPUUmfKHW zhQ81E=Q=sW5;!vfwT%o_H>u2}HilkAke8!{{Q6WxKOvvHd4&vNclbt5wYe^BqXgJ{ z5;tR^wi9rMxQadEu0r|`)qq99W8BR~m`s)^iisW>$)q^NRIHG9Y)!F+YP7EX#Ee*v zB>(y?Wsm%#ON>?cNVuqc{+0CxZ>-GIn~Q{5-s)VCk5{3J)Z@_2t!aGn3oNt?({38r zbkMsFu2eB30D|!ttq!a?F%JVmXvZj}Hb49o2A<^FuKi&Jp(kgmB*PN|%V)%i4ng&M zkEL?h@iH$_eF|&lHqk^fTnPQ|h}=i+zun=j6)2g}C%iTAS3Va>Inm%fZ}z}( zr-OIxIVP4kJudY@<`^1dt-gBtH$uj`_MXV#oGuDd!Z9RX?(IfJKeilgD#5@uZLlcD zb?fy)_g$`m+f$~--vUACC=;UPVCFKM!fN=Z5_{315|C-8_PNpps2f)(kuj)6dOdVv zGfU?MkR>stz1}=;1fKMZNy5-LJ0X{YGu4*mysi$ulCtgb7A1T})_t*=o($56t9q6- zU&nWVA?0~wXLy9<_orp^(;%y0!a!^I|Hs%l1c?%L*}81|mTlX%ZQZhM+qP}nwr$(C z>)jr7M-TpZ(X*40^POkqUh7+~eUOy-s4&0z#y75=s@)>fVTzZmU~SSNki`EAEQs;Q zAEv&gFk<#fUnF^{C=RqGc?lw#CQ+18Y}Vt_nZ-J224_$0&|w)aiQDZY1?iS^M<{!z zNl|6ce2f0R=5w4B{{YS6Rt!Q!0Z!>y+HtdfvRZ-qR?_2KoBIWPThXj30UOl`P28#+ z-nGhPgSfAHIq^gK&)3U7Pd~x9BBn}jGG68WF2$L3`}&cR58$f8;n7WBkWHD^+{Ale z@O$W2F<&XAQR9c|T!czA$bmvSq8-{|3?o6>2!F|mj zsxYJ~)?pBGa^zlii>XahcjO^uS|-iNcPthRSo^G4NYg(|wy2;;pE+YmKNS|j&QZPP zPvW|4?~lPn3?dO>3szqe5cVW7T2jCc-TNZad!*3Vbyb{J97GN$MlkyV1?Q4-a+jOk z;*|a!Ow#s~p8YYHQ~rw@d%?_F&z}#t-r8-_5!VTaku@DrR~y0fkNGmrAZY#r{BlVn znIs)nY35vW>D)4EI9ZBnm3KW_fCM(~URkMKQF1l=H0gh|EAWmXDRT?OUixAh;&_c5 zcjlHfSez(MC%G>6;2jmiXTt{bNtY_BuhvnKgi(a`mWJ0?d@db@=Z68s|-u^D_UKic1iQ)g4VMvJKK{PoAg=A