polytope-python 1.0.36__tar.gz → 1.0.37__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {polytope_python-1.0.36/polytope_python.egg-info → polytope_python-1.0.37}/PKG-INFO +1 -1
- {polytope_python-1.0.36 → polytope_python-1.0.37}/polytope_feature/datacube/backends/fdb.py +5 -2
- {polytope_python-1.0.36 → polytope_python-1.0.37}/polytope_feature/polytope.py +3 -3
- {polytope_python-1.0.36 → polytope_python-1.0.37}/polytope_feature/shapes.py +4 -2
- polytope_python-1.0.37/polytope_feature/version.py +1 -0
- {polytope_python-1.0.36 → polytope_python-1.0.37/polytope_python.egg-info}/PKG-INFO +1 -1
- {polytope_python-1.0.36 → polytope_python-1.0.37}/tests/test_point_union.py +51 -0
- polytope_python-1.0.36/polytope_feature/version.py +0 -1
- {polytope_python-1.0.36 → polytope_python-1.0.37}/LICENSE +0 -0
- {polytope_python-1.0.36 → polytope_python-1.0.37}/MANIFEST.in +0 -0
- {polytope_python-1.0.36 → polytope_python-1.0.37}/polytope_feature/__init__.py +0 -0
- {polytope_python-1.0.36 → polytope_python-1.0.37}/polytope_feature/datacube/__init__.py +0 -0
- {polytope_python-1.0.36 → polytope_python-1.0.37}/polytope_feature/datacube/backends/__init__.py +0 -0
- {polytope_python-1.0.36 → polytope_python-1.0.37}/polytope_feature/datacube/backends/datacube.py +0 -0
- {polytope_python-1.0.36 → polytope_python-1.0.37}/polytope_feature/datacube/backends/mock.py +0 -0
- {polytope_python-1.0.36 → polytope_python-1.0.37}/polytope_feature/datacube/backends/xarray.py +0 -0
- {polytope_python-1.0.36 → polytope_python-1.0.37}/polytope_feature/datacube/datacube_axis.py +0 -0
- {polytope_python-1.0.36 → polytope_python-1.0.37}/polytope_feature/datacube/index_tree_pb2.py +0 -0
- {polytope_python-1.0.36 → polytope_python-1.0.37}/polytope_feature/datacube/tensor_index_tree.py +0 -0
- {polytope_python-1.0.36 → polytope_python-1.0.37}/polytope_feature/datacube/transformations/__init__.py +0 -0
- {polytope_python-1.0.36 → polytope_python-1.0.37}/polytope_feature/datacube/transformations/datacube_cyclic/__init__.py +0 -0
- {polytope_python-1.0.36 → polytope_python-1.0.37}/polytope_feature/datacube/transformations/datacube_cyclic/datacube_cyclic.py +0 -0
- {polytope_python-1.0.36 → polytope_python-1.0.37}/polytope_feature/datacube/transformations/datacube_mappers/__init__.py +0 -0
- {polytope_python-1.0.36 → polytope_python-1.0.37}/polytope_feature/datacube/transformations/datacube_mappers/datacube_mappers.py +0 -0
- {polytope_python-1.0.36 → polytope_python-1.0.37}/polytope_feature/datacube/transformations/datacube_mappers/mapper_types/__init__.py +0 -0
- {polytope_python-1.0.36 → polytope_python-1.0.37}/polytope_feature/datacube/transformations/datacube_mappers/mapper_types/healpix.py +0 -0
- {polytope_python-1.0.36 → polytope_python-1.0.37}/polytope_feature/datacube/transformations/datacube_mappers/mapper_types/healpix_nested.py +0 -0
- {polytope_python-1.0.36 → polytope_python-1.0.37}/polytope_feature/datacube/transformations/datacube_mappers/mapper_types/local_regular.py +0 -0
- {polytope_python-1.0.36 → polytope_python-1.0.37}/polytope_feature/datacube/transformations/datacube_mappers/mapper_types/octahedral.py +0 -0
- {polytope_python-1.0.36 → polytope_python-1.0.37}/polytope_feature/datacube/transformations/datacube_mappers/mapper_types/reduced_gaussian.py +0 -0
- {polytope_python-1.0.36 → polytope_python-1.0.37}/polytope_feature/datacube/transformations/datacube_mappers/mapper_types/reduced_ll.py +0 -0
- {polytope_python-1.0.36 → polytope_python-1.0.37}/polytope_feature/datacube/transformations/datacube_mappers/mapper_types/regular.py +0 -0
- {polytope_python-1.0.36 → polytope_python-1.0.37}/polytope_feature/datacube/transformations/datacube_merger/__init__.py +0 -0
- {polytope_python-1.0.36 → polytope_python-1.0.37}/polytope_feature/datacube/transformations/datacube_merger/datacube_merger.py +0 -0
- {polytope_python-1.0.36 → polytope_python-1.0.37}/polytope_feature/datacube/transformations/datacube_reverse/__init__.py +0 -0
- {polytope_python-1.0.36 → polytope_python-1.0.37}/polytope_feature/datacube/transformations/datacube_reverse/datacube_reverse.py +0 -0
- {polytope_python-1.0.36 → polytope_python-1.0.37}/polytope_feature/datacube/transformations/datacube_transformations.py +0 -0
- {polytope_python-1.0.36 → polytope_python-1.0.37}/polytope_feature/datacube/transformations/datacube_type_change/__init__.py +0 -0
- {polytope_python-1.0.36 → polytope_python-1.0.37}/polytope_feature/datacube/transformations/datacube_type_change/datacube_type_change.py +0 -0
- {polytope_python-1.0.36 → polytope_python-1.0.37}/polytope_feature/datacube/tree_encoding.py +0 -0
- {polytope_python-1.0.36 → polytope_python-1.0.37}/polytope_feature/engine/__init__.py +0 -0
- {polytope_python-1.0.36 → polytope_python-1.0.37}/polytope_feature/engine/engine.py +0 -0
- {polytope_python-1.0.36 → polytope_python-1.0.37}/polytope_feature/engine/hullslicer.py +0 -0
- {polytope_python-1.0.36 → polytope_python-1.0.37}/polytope_feature/options.py +0 -0
- {polytope_python-1.0.36 → polytope_python-1.0.37}/polytope_feature/utility/__init__.py +0 -0
- {polytope_python-1.0.36 → polytope_python-1.0.37}/polytope_feature/utility/combinatorics.py +0 -0
- {polytope_python-1.0.36 → polytope_python-1.0.37}/polytope_feature/utility/exceptions.py +0 -0
- {polytope_python-1.0.36 → polytope_python-1.0.37}/polytope_feature/utility/geometry.py +0 -0
- {polytope_python-1.0.36 → polytope_python-1.0.37}/polytope_feature/utility/list_tools.py +0 -0
- {polytope_python-1.0.36 → polytope_python-1.0.37}/polytope_feature/utility/profiling.py +0 -0
- {polytope_python-1.0.36 → polytope_python-1.0.37}/polytope_python.egg-info/SOURCES.txt +0 -0
- {polytope_python-1.0.36 → polytope_python-1.0.37}/polytope_python.egg-info/dependency_links.txt +0 -0
- {polytope_python-1.0.36 → polytope_python-1.0.37}/polytope_python.egg-info/not-zip-safe +0 -0
- {polytope_python-1.0.36 → polytope_python-1.0.37}/polytope_python.egg-info/requires.txt +0 -0
- {polytope_python-1.0.36 → polytope_python-1.0.37}/polytope_python.egg-info/top_level.txt +0 -0
- {polytope_python-1.0.36 → polytope_python-1.0.37}/pyproject.toml +0 -0
- {polytope_python-1.0.36 → polytope_python-1.0.37}/requirements.txt +0 -0
- {polytope_python-1.0.36 → polytope_python-1.0.37}/setup.cfg +0 -0
- {polytope_python-1.0.36 → polytope_python-1.0.37}/setup.py +0 -0
- {polytope_python-1.0.36 → polytope_python-1.0.37}/tests/test_axis_mappers.py +0 -0
- {polytope_python-1.0.36 → polytope_python-1.0.37}/tests/test_bad_request_error.py +0 -0
- {polytope_python-1.0.36 → polytope_python-1.0.37}/tests/test_combinatorics.py +0 -0
- {polytope_python-1.0.36 → polytope_python-1.0.37}/tests/test_cyclic_axis_over_negative_vals.py +0 -0
- {polytope_python-1.0.36 → polytope_python-1.0.37}/tests/test_cyclic_axis_slicer_not_0.py +0 -0
- {polytope_python-1.0.36 → polytope_python-1.0.37}/tests/test_cyclic_axis_slicing.py +0 -0
- {polytope_python-1.0.36 → polytope_python-1.0.37}/tests/test_cyclic_nearest.py +0 -0
- {polytope_python-1.0.36 → polytope_python-1.0.37}/tests/test_cyclic_simple.py +0 -0
- {polytope_python-1.0.36 → polytope_python-1.0.37}/tests/test_cyclic_snapping.py +0 -0
- {polytope_python-1.0.36 → polytope_python-1.0.37}/tests/test_datacube_axes_init.py +0 -0
- {polytope_python-1.0.36 → polytope_python-1.0.37}/tests/test_datacube_mock.py +0 -0
- {polytope_python-1.0.36 → polytope_python-1.0.37}/tests/test_datacube_xarray.py +0 -0
- {polytope_python-1.0.36 → polytope_python-1.0.37}/tests/test_date_time_unmerged.py +0 -0
- {polytope_python-1.0.36 → polytope_python-1.0.37}/tests/test_ecmwf_oper_data_fdb.py +0 -0
- {polytope_python-1.0.36 → polytope_python-1.0.37}/tests/test_engine_slicer.py +0 -0
- {polytope_python-1.0.36 → polytope_python-1.0.37}/tests/test_fdb_datacube.py +0 -0
- {polytope_python-1.0.36 → polytope_python-1.0.37}/tests/test_fdb_unmap_tree.py +0 -0
- {polytope_python-1.0.36 → polytope_python-1.0.37}/tests/test_float_type.py +0 -0
- {polytope_python-1.0.36 → polytope_python-1.0.37}/tests/test_healpix_mapper.py +0 -0
- {polytope_python-1.0.36 → polytope_python-1.0.37}/tests/test_healpix_nested_grid.py +0 -0
- {polytope_python-1.0.36 → polytope_python-1.0.37}/tests/test_hull_slicer.py +0 -0
- {polytope_python-1.0.36 → polytope_python-1.0.37}/tests/test_hullslicer_engine.py +0 -0
- {polytope_python-1.0.36 → polytope_python-1.0.37}/tests/test_incomplete_tree_fdb.py +0 -0
- {polytope_python-1.0.36 → polytope_python-1.0.37}/tests/test_local_grid_cyclic.py +0 -0
- {polytope_python-1.0.36 → polytope_python-1.0.37}/tests/test_local_regular_grid.py +0 -0
- {polytope_python-1.0.36 → polytope_python-1.0.37}/tests/test_local_swiss_grid.py +0 -0
- {polytope_python-1.0.36 → polytope_python-1.0.37}/tests/test_mappers.py +0 -0
- {polytope_python-1.0.36 → polytope_python-1.0.37}/tests/test_merge_cyclic_octahedral.py +0 -0
- {polytope_python-1.0.36 → polytope_python-1.0.37}/tests/test_merge_octahedral_one_axis.py +0 -0
- {polytope_python-1.0.36 → polytope_python-1.0.37}/tests/test_merge_transformation.py +0 -0
- {polytope_python-1.0.36 → polytope_python-1.0.37}/tests/test_multiple_param_fdb.py +0 -0
- {polytope_python-1.0.36 → polytope_python-1.0.37}/tests/test_octahedral_grid.py +0 -0
- {polytope_python-1.0.36 → polytope_python-1.0.37}/tests/test_override_md5_hash_options.py +0 -0
- {polytope_python-1.0.36 → polytope_python-1.0.37}/tests/test_point_nearest.py +0 -0
- {polytope_python-1.0.36 → polytope_python-1.0.37}/tests/test_point_shape.py +0 -0
- {polytope_python-1.0.36 → polytope_python-1.0.37}/tests/test_profiling_requesttree.py +0 -0
- {polytope_python-1.0.36 → polytope_python-1.0.37}/tests/test_reduced_ll_grid.py +0 -0
- {polytope_python-1.0.36 → polytope_python-1.0.37}/tests/test_regular_grid.py +0 -0
- {polytope_python-1.0.36 → polytope_python-1.0.37}/tests/test_regular_reduced_grid.py +0 -0
- {polytope_python-1.0.36 → polytope_python-1.0.37}/tests/test_request_tree.py +0 -0
- {polytope_python-1.0.36 → polytope_python-1.0.37}/tests/test_request_trees_after_slicing.py +0 -0
- {polytope_python-1.0.36 → polytope_python-1.0.37}/tests/test_reverse_transformation.py +0 -0
- {polytope_python-1.0.36 → polytope_python-1.0.37}/tests/test_shapes.py +0 -0
- {polytope_python-1.0.36 → polytope_python-1.0.37}/tests/test_slice_date_range_fdb.py +0 -0
- {polytope_python-1.0.36 → polytope_python-1.0.37}/tests/test_slice_date_range_fdb_v2.py +0 -0
- {polytope_python-1.0.36 → polytope_python-1.0.37}/tests/test_slice_fdb_box.py +0 -0
- {polytope_python-1.0.36 → polytope_python-1.0.37}/tests/test_slicer_engine.py +0 -0
- {polytope_python-1.0.36 → polytope_python-1.0.37}/tests/test_slicer_era5.py +0 -0
- {polytope_python-1.0.36 → polytope_python-1.0.37}/tests/test_slicer_xarray.py +0 -0
- {polytope_python-1.0.36 → polytope_python-1.0.37}/tests/test_slicing_unsliceable_axis.py +0 -0
- {polytope_python-1.0.36 → polytope_python-1.0.37}/tests/test_slicing_xarray_3D.py +0 -0
- {polytope_python-1.0.36 → polytope_python-1.0.37}/tests/test_slicing_xarray_4D.py +0 -0
- {polytope_python-1.0.36 → polytope_python-1.0.37}/tests/test_snapping.py +0 -0
- {polytope_python-1.0.36 → polytope_python-1.0.37}/tests/test_snapping_real_data.py +0 -0
- {polytope_python-1.0.36 → polytope_python-1.0.37}/tests/test_tree_protobuf.py +0 -0
- {polytope_python-1.0.36 → polytope_python-1.0.37}/tests/test_tree_protobuf_encoding.py +0 -0
- {polytope_python-1.0.36 → polytope_python-1.0.37}/tests/test_tree_protobuf_encoding_fdb.py +0 -0
- {polytope_python-1.0.36 → polytope_python-1.0.37}/tests/test_type_change_transformation.py +0 -0
- {polytope_python-1.0.36 → polytope_python-1.0.37}/tests/test_union_gj.py +0 -0
- {polytope_python-1.0.36 → polytope_python-1.0.37}/tests/test_union_point_box.py +0 -0
- {polytope_python-1.0.36 → polytope_python-1.0.37}/tests/test_wave_spectra_data.py +0 -0
|
@@ -236,9 +236,12 @@ class FDBDatacube(Datacube):
|
|
|
236
236
|
raise Exception("nearest point search axes are wrong")
|
|
237
237
|
|
|
238
238
|
second_ax = requests.children[0].children[0].axis
|
|
239
|
-
|
|
239
|
+
|
|
240
|
+
nearest_pts = self.nearest_search.get((first_ax_name, second_ax_name), None)
|
|
240
241
|
if nearest_pts is None:
|
|
241
|
-
nearest_pts = self.nearest_search
|
|
242
|
+
nearest_pts = self.nearest_search.get((second_ax_name, first_ax_name), None)
|
|
243
|
+
for i, pt in enumerate(nearest_pts):
|
|
244
|
+
nearest_pts[i] = [pt[1], pt[0]]
|
|
242
245
|
|
|
243
246
|
transformed_nearest_pts = []
|
|
244
247
|
for point in nearest_pts:
|
|
@@ -67,10 +67,10 @@ class Polytope:
|
|
|
67
67
|
for polytope in request.polytopes():
|
|
68
68
|
method = polytope.method
|
|
69
69
|
if method == "nearest":
|
|
70
|
-
if self.datacube.nearest_search.get(polytope.axes()
|
|
71
|
-
self.datacube.nearest_search[polytope.axes()
|
|
70
|
+
if self.datacube.nearest_search.get(tuple(polytope.axes()), None) is None:
|
|
71
|
+
self.datacube.nearest_search[tuple(polytope.axes())] = polytope.values
|
|
72
72
|
else:
|
|
73
|
-
self.datacube.nearest_search[polytope.axes()
|
|
73
|
+
self.datacube.nearest_search[tuple(polytope.axes())].append(polytope.values[0])
|
|
74
74
|
request_tree = self.engine.extract(self.datacube, request.polytopes())
|
|
75
75
|
logging.info("Created request tree for %s ", self.context)
|
|
76
76
|
self.datacube.get(request_tree, self.context)
|
|
@@ -68,8 +68,10 @@ class Product(Shape):
|
|
|
68
68
|
# TODO
|
|
69
69
|
all_axes = []
|
|
70
70
|
for poly in polytopes:
|
|
71
|
-
|
|
72
|
-
|
|
71
|
+
for ax in poly.axes():
|
|
72
|
+
if ax not in all_axes:
|
|
73
|
+
all_axes.append(ax)
|
|
74
|
+
self._axes = all_axes
|
|
73
75
|
# Check there weren't any duplicates in the polytopes' axes
|
|
74
76
|
assert len(self._axes) == len(all_axes)
|
|
75
77
|
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "1.0.37"
|
|
@@ -117,6 +117,57 @@ class TestSlicingFDBDatacube:
|
|
|
117
117
|
tot_leaves += len(leaf.result)
|
|
118
118
|
assert tot_leaves == 9
|
|
119
119
|
|
|
120
|
+
@pytest.mark.fdb
|
|
121
|
+
def test_fdb_datacube_axis_order(self):
|
|
122
|
+
import pygribjump as gj
|
|
123
|
+
|
|
124
|
+
request = Request(
|
|
125
|
+
Select("step", [0]),
|
|
126
|
+
Select("levtype", ["sfc"]),
|
|
127
|
+
Span("date", pd.Timestamp("20230625T120000"), pd.Timestamp("20230626T120000")),
|
|
128
|
+
Select("domain", ["g"]),
|
|
129
|
+
Select("expver", ["0001"]),
|
|
130
|
+
Select("param", ["167"]),
|
|
131
|
+
Select("class", ["od"]),
|
|
132
|
+
Select("stream", ["oper"]),
|
|
133
|
+
Select("type", ["an"]),
|
|
134
|
+
Union(
|
|
135
|
+
["latitude", "longitude"],
|
|
136
|
+
Point(["latitude", "longitude"], [[25, 30]], method="nearest"),
|
|
137
|
+
),
|
|
138
|
+
)
|
|
139
|
+
|
|
140
|
+
inverted_request = Request(
|
|
141
|
+
Select("step", [0]),
|
|
142
|
+
Select("levtype", ["sfc"]),
|
|
143
|
+
Span("date", pd.Timestamp("20230625T120000"), pd.Timestamp("20230626T120000")),
|
|
144
|
+
Select("domain", ["g"]),
|
|
145
|
+
Select("expver", ["0001"]),
|
|
146
|
+
Select("param", ["167"]),
|
|
147
|
+
Select("class", ["od"]),
|
|
148
|
+
Select("stream", ["oper"]),
|
|
149
|
+
Select("type", ["an"]),
|
|
150
|
+
Union(
|
|
151
|
+
["longitude", "latitude"],
|
|
152
|
+
Point(["longitude", "latitude"], [[30, 25]], method="nearest"),
|
|
153
|
+
),
|
|
154
|
+
)
|
|
155
|
+
|
|
156
|
+
self.fdbdatacube = gj.GribJump()
|
|
157
|
+
self.slicer = HullSlicer()
|
|
158
|
+
self.API = Polytope(
|
|
159
|
+
datacube=self.fdbdatacube,
|
|
160
|
+
engine=self.slicer,
|
|
161
|
+
options=self.options,
|
|
162
|
+
)
|
|
163
|
+
result = self.API.retrieve(request)
|
|
164
|
+
inverted_result = self.API.retrieve(inverted_request)
|
|
165
|
+
result.pprint()
|
|
166
|
+
inverted_result.pprint()
|
|
167
|
+
assert len(result.leaves) == 1
|
|
168
|
+
assert len(inverted_result.leaves) == 1
|
|
169
|
+
assert inverted_result.leaves[0].result == result.leaves[0].result
|
|
170
|
+
|
|
120
171
|
# @pytest.mark.fdb
|
|
121
172
|
# def test_fdb_datacube_mix_methods(self):
|
|
122
173
|
# import pygribjump as gj
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
__version__ = "1.0.36"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{polytope_python-1.0.36 → polytope_python-1.0.37}/polytope_feature/datacube/backends/__init__.py
RENAMED
|
File without changes
|
{polytope_python-1.0.36 → polytope_python-1.0.37}/polytope_feature/datacube/backends/datacube.py
RENAMED
|
File without changes
|
{polytope_python-1.0.36 → polytope_python-1.0.37}/polytope_feature/datacube/backends/mock.py
RENAMED
|
File without changes
|
{polytope_python-1.0.36 → polytope_python-1.0.37}/polytope_feature/datacube/backends/xarray.py
RENAMED
|
File without changes
|
{polytope_python-1.0.36 → polytope_python-1.0.37}/polytope_feature/datacube/datacube_axis.py
RENAMED
|
File without changes
|
{polytope_python-1.0.36 → polytope_python-1.0.37}/polytope_feature/datacube/index_tree_pb2.py
RENAMED
|
File without changes
|
{polytope_python-1.0.36 → polytope_python-1.0.37}/polytope_feature/datacube/tensor_index_tree.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{polytope_python-1.0.36 → polytope_python-1.0.37}/polytope_feature/datacube/tree_encoding.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{polytope_python-1.0.36 → polytope_python-1.0.37}/polytope_python.egg-info/dependency_links.txt
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{polytope_python-1.0.36 → polytope_python-1.0.37}/tests/test_cyclic_axis_over_negative_vals.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|