flowtracks 1.6.2.dev4__py3-none-any.whl → 1.6.2.dev6__py3-none-any.whl
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.
- flowtracks/_version.py +3 -3
- flowtracks/graphics.py +26 -6
- flowtracks/writers.py +31 -3
- {flowtracks-1.6.2.dev4.dist-info → flowtracks-1.6.2.dev6.dist-info}/METADATA +1 -1
- {flowtracks-1.6.2.dev4.dist-info → flowtracks-1.6.2.dev6.dist-info}/RECORD +27 -27
- {flowtracks-1.6.2.dev4.data → flowtracks-1.6.2.dev6.data}/data/flowtracks-examples/batch_Lagrangian_to_Eulerian.py +0 -0
- {flowtracks-1.6.2.dev4.data → flowtracks-1.6.2.dev6.data}/data/flowtracks-examples/hdf5_scene_analysis.ipynb +0 -0
- {flowtracks-1.6.2.dev4.data → flowtracks-1.6.2.dev6.data}/data/flowtracks-examples/linking_trajectories.ipynb +0 -0
- {flowtracks-1.6.2.dev4.data → flowtracks-1.6.2.dev6.data}/data/flowtracks-examples/marimo_dual_rig_trajectories.py +0 -0
- {flowtracks-1.6.2.dev4.data → flowtracks-1.6.2.dev6.data}/data/flowtracks-examples/marimo_flowtracks.py +0 -0
- {flowtracks-1.6.2.dev4.data → flowtracks-1.6.2.dev6.data}/data/flowtracks-examples/marimo_hdf5_vs_zarr_scene_analysis.py +0 -0
- {flowtracks-1.6.2.dev4.data → flowtracks-1.6.2.dev6.data}/data/flowtracks-examples/marimo_linking_trajectories_zarr.py +0 -0
- {flowtracks-1.6.2.dev4.data → flowtracks-1.6.2.dev6.data}/data/flowtracks-examples/marimo_phase_averaging_demo.py +0 -0
- {flowtracks-1.6.2.dev4.data → flowtracks-1.6.2.dev6.data}/data/flowtracks-examples/marimo_phase_metrics.py +0 -0
- {flowtracks-1.6.2.dev4.data → flowtracks-1.6.2.dev6.data}/data/flowtracks-examples/marimo_vtk_writers_preview.py +0 -0
- {flowtracks-1.6.2.dev4.data → flowtracks-1.6.2.dev6.data}/data/flowtracks-examples/marimo_zarr_dashboard.py +0 -0
- {flowtracks-1.6.2.dev4.data → flowtracks-1.6.2.dev6.data}/data/flowtracks-examples/repeated_interpolation.ipynb +0 -0
- {flowtracks-1.6.2.dev4.data → flowtracks-1.6.2.dev6.data}/data/flowtracks-examples/run_pipeline.py +0 -0
- {flowtracks-1.6.2.dev4.data → flowtracks-1.6.2.dev6.data}/data/flowtracks-examples/visualize_marimo.py +0 -0
- {flowtracks-1.6.2.dev4.data → flowtracks-1.6.2.dev6.data}/data/flowtracks-examples/visualize_results.py +0 -0
- {flowtracks-1.6.2.dev4.data → flowtracks-1.6.2.dev6.data}/scripts/analyse_fhdf.py +0 -0
- {flowtracks-1.6.2.dev4.dist-info → flowtracks-1.6.2.dev6.dist-info}/WHEEL +0 -0
- {flowtracks-1.6.2.dev4.dist-info → flowtracks-1.6.2.dev6.dist-info}/entry_points.txt +0 -0
- {flowtracks-1.6.2.dev4.dist-info → flowtracks-1.6.2.dev6.dist-info}/licenses/LICENSE.txt +0 -0
- {flowtracks-1.6.2.dev4.dist-info → flowtracks-1.6.2.dev6.dist-info}/licenses/LICENSES/BSD-3-Clause.txt +0 -0
- {flowtracks-1.6.2.dev4.dist-info → flowtracks-1.6.2.dev6.dist-info}/licenses/LICENSES/GPL-3.0-only.txt +0 -0
- {flowtracks-1.6.2.dev4.dist-info → flowtracks-1.6.2.dev6.dist-info}/top_level.txt +0 -0
flowtracks/_version.py
CHANGED
|
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
|
|
|
18
18
|
commit_id: str | None
|
|
19
19
|
__commit_id__: str | None
|
|
20
20
|
|
|
21
|
-
__version__ = version = '1.6.2.
|
|
22
|
-
__version_tuple__ = version_tuple = (1, 6, 2, '
|
|
21
|
+
__version__ = version = '1.6.2.dev6'
|
|
22
|
+
__version_tuple__ = version_tuple = (1, 6, 2, 'dev6')
|
|
23
23
|
|
|
24
|
-
__commit_id__ = commit_id = '
|
|
24
|
+
__commit_id__ = commit_id = 'g519243be4'
|
flowtracks/graphics.py
CHANGED
|
@@ -20,6 +20,8 @@ PyVista (VTK, GPU-rendered polylines -- the ``vtk`` extra), from the same
|
|
|
20
20
|
PolyData the ``.vtp`` ParaView writer saves.
|
|
21
21
|
"""
|
|
22
22
|
|
|
23
|
+
from pathlib import Path
|
|
24
|
+
|
|
23
25
|
import matplotlib.pyplot as pl
|
|
24
26
|
import numpy as np
|
|
25
27
|
|
|
@@ -249,7 +251,8 @@ def select_trajectories(source, by="length", n=10, min_points=20, min_extent=0.0
|
|
|
249
251
|
|
|
250
252
|
def plot_trajectories_3d(source, trajids=None, scalars="speed", context=0,
|
|
251
253
|
plotter=None, cmap="plasma", clim=None, line_width=3,
|
|
252
|
-
point_size=6, title=None, bar_title=None, show=True
|
|
254
|
+
point_size=6, title=None, bar_title=None, show=True,
|
|
255
|
+
units=None):
|
|
253
256
|
"""Interactive 3D trajectory view (PyVista): polylines coloured by a point
|
|
254
257
|
array (``speed``, ``time``, ``trajid``), points drawn as spheres so short
|
|
255
258
|
tracks stay visible.
|
|
@@ -264,14 +267,30 @@ def plot_trajectories_3d(source, trajids=None, scalars="speed", context=0,
|
|
|
264
267
|
with the same title into one shared colour range, so give each
|
|
265
268
|
subplot its own title to keep its own range.
|
|
266
269
|
show - call ``plotter.show()``; pass False to compose or screenshot.
|
|
270
|
+
units - ``{"pos": "m", "vel": "m s-1", "time": "frame"}`` for axis and
|
|
271
|
+
colour-bar titles (``x [m]``, ``speed [m s-1]``). When omitted and
|
|
272
|
+
``source`` is a Zarr path, whatever the writer recorded is used;
|
|
273
|
+
otherwise titles stay bare rather than guessed.
|
|
267
274
|
|
|
268
275
|
Returns the plotter.
|
|
269
276
|
"""
|
|
270
277
|
import pyvista as pv
|
|
271
278
|
|
|
272
|
-
from flowtracks.writers import
|
|
273
|
-
|
|
274
|
-
|
|
279
|
+
from flowtracks.writers import (
|
|
280
|
+
_trajectory_arrays,
|
|
281
|
+
trajectory_polydata,
|
|
282
|
+
trajectory_units,
|
|
283
|
+
)
|
|
284
|
+
|
|
285
|
+
if units is None and isinstance(source, (str, Path)):
|
|
286
|
+
units = trajectory_units(source)
|
|
287
|
+
units = units or {}
|
|
288
|
+
pos_u = f" [{units['pos']}]" if units.get("pos") else ""
|
|
289
|
+
scalar_u = f" [{units['vel']}]" if scalars in ("speed", "velocity") and units.get("vel") else ""
|
|
290
|
+
if not scalar_u and scalars == "time" and units.get("time"):
|
|
291
|
+
scalar_u = f" [{units['time']}]"
|
|
292
|
+
|
|
293
|
+
poly = trajectory_polydata(source, trajids, units=units or None)
|
|
275
294
|
if plotter is None:
|
|
276
295
|
plotter = pv.Plotter()
|
|
277
296
|
if context:
|
|
@@ -280,14 +299,15 @@ def plot_trajectories_3d(source, trajids=None, scalars="speed", context=0,
|
|
|
280
299
|
plotter.add_points(pos[pick], color="grey", opacity=0.15, point_size=2,
|
|
281
300
|
name="context")
|
|
282
301
|
if poly.n_points:
|
|
283
|
-
bar = {"title": bar_title or scalars}
|
|
302
|
+
bar = {"title": (bar_title or scalars) + scalar_u}
|
|
284
303
|
plotter.add_mesh(poly, scalars=scalars, cmap=cmap, clim=clim, line_width=line_width,
|
|
285
304
|
render_lines_as_tubes=True, scalar_bar_args=bar, name="tracks")
|
|
286
305
|
plotter.add_mesh(poly.extract_points(np.arange(poly.n_points), adjacent_cells=False),
|
|
287
306
|
scalars=scalars, cmap=cmap, clim=clim, point_size=point_size,
|
|
288
307
|
render_points_as_spheres=True, style="points",
|
|
289
308
|
show_scalar_bar=False, name="points")
|
|
290
|
-
plotter.show_grid(xtitle="x", ytitle="y", ztitle="z",
|
|
309
|
+
plotter.show_grid(xtitle=f"x{pos_u}", ytitle=f"y{pos_u}", ztitle=f"z{pos_u}",
|
|
310
|
+
fmt="%.3g",
|
|
291
311
|
n_xlabels=3, n_ylabels=3, n_zlabels=3)
|
|
292
312
|
plotter.add_axes()
|
|
293
313
|
if title:
|
flowtracks/writers.py
CHANGED
|
@@ -69,17 +69,43 @@ def _trajectory_arrays(source):
|
|
|
69
69
|
raise TypeError(f"Unsupported trajectory source: {type(source)!r}")
|
|
70
70
|
|
|
71
71
|
|
|
72
|
-
def
|
|
72
|
+
def trajectory_units(source) -> dict:
|
|
73
|
+
"""Units recorded on a trajectories store ({pos, vel, time, ...} units).
|
|
74
|
+
|
|
75
|
+
Zarr paths report what the writer recorded; anything else reports {} --
|
|
76
|
+
the caller then labels without units rather than guessing.
|
|
77
|
+
"""
|
|
78
|
+
if isinstance(source, (str, Path)):
|
|
79
|
+
try:
|
|
80
|
+
import zarr
|
|
81
|
+
|
|
82
|
+
group = zarr.open_group(str(source), mode="r")
|
|
83
|
+
target = group["trajectories"] if "trajectories" in group else group
|
|
84
|
+
return {
|
|
85
|
+
k[:-6]: v
|
|
86
|
+
for k, v in dict(target.attrs).items()
|
|
87
|
+
if k.endswith("_units")
|
|
88
|
+
}
|
|
89
|
+
except Exception:
|
|
90
|
+
pass
|
|
91
|
+
return {}
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
def trajectory_polydata(source, trajids=None, units=None):
|
|
73
95
|
"""Lagrangian trajectories as VTK PolyData: points + one polyline per trajid.
|
|
74
96
|
|
|
75
97
|
``source`` as for :func:`write_trajectories_vtp`. ``trajids`` optionally
|
|
76
98
|
keeps only those trajectories. Point data: ``trajid``, ``time``,
|
|
77
|
-
``velocity``, ``speed``.
|
|
78
|
-
|
|
99
|
+
``velocity``, ``speed``. ``units`` (e.g. ``{"pos": "m"}``) is stored as
|
|
100
|
+
field data (``units:<name>``); when omitted and ``source`` is a Zarr path,
|
|
101
|
+
whatever the writer recorded is carried over. Shared by the ``.vtp``
|
|
102
|
+
writer and :func:`flowtracks.graphics.plot_trajectories_3d`.
|
|
79
103
|
"""
|
|
80
104
|
import pyvista as pv
|
|
81
105
|
|
|
82
106
|
pos, vel, time, trajid = _trajectory_arrays(source)
|
|
107
|
+
if units is None and isinstance(source, (str, Path)):
|
|
108
|
+
units = trajectory_units(source)
|
|
83
109
|
if trajids is not None:
|
|
84
110
|
keep = np.isin(trajid, np.asarray(trajids))
|
|
85
111
|
pos, vel, time, trajid = pos[keep], vel[keep], time[keep], trajid[keep]
|
|
@@ -104,6 +130,8 @@ def trajectory_polydata(source, trajids=None):
|
|
|
104
130
|
poly.point_data["time"] = time
|
|
105
131
|
poly.point_data["velocity"] = vel
|
|
106
132
|
poly.point_data["speed"] = np.linalg.norm(vel, axis=1)
|
|
133
|
+
for k, val in (units or {}).items():
|
|
134
|
+
poly.field_data[f"units:{k}"] = np.array([str(val)])
|
|
107
135
|
return poly
|
|
108
136
|
|
|
109
137
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: flowtracks
|
|
3
|
-
Version: 1.6.2.
|
|
3
|
+
Version: 1.6.2.dev6
|
|
4
4
|
Summary: Library for handling 3D PTV trajectory databases and Lagrangian/Eulerian turbulence post-processing.
|
|
5
5
|
Author-email: Yosef Meller <yosefm@gmail.com>
|
|
6
6
|
License-Expression: GPL-3.0-only AND BSD-3-Clause
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
flowtracks/__init__.py,sha256=iCexskmRtpNJ0fNZWRFkQAqrku7csbKy5NtL2YQNYeo,1532
|
|
2
|
-
flowtracks/_version.py,sha256
|
|
2
|
+
flowtracks/_version.py,sha256=-2KICqAEdPWLo6oH9F7DHgtleuBtdR0ws16EQh2o6wM,541
|
|
3
3
|
flowtracks/an_scene.py,sha256=QV_gtzp-5h1CqAW1Y6ieGco9BxXQDE4f_7-fcy3fluI,7361
|
|
4
4
|
flowtracks/analysis.py,sha256=nob5-pKxjPzB34_oQsxmxYALz4Q_s1BTpC5_VgXX3ss,6320
|
|
5
5
|
flowtracks/combine.py,sha256=-UQtbTH4vjQS88_92h5UZlS60OfQofTWEV6SL1prXgI,4455
|
|
@@ -7,7 +7,7 @@ flowtracks/eulerian.py,sha256=PMt0_TtjrFwRPEvSEKm_wn8YZdClSux4yXEuxiB2EjM,41872
|
|
|
7
7
|
flowtracks/flux.py,sha256=w4K_jjDWTBIOj4BkoeNoKjIRcvg_6stCqNF8iivxF-A,15137
|
|
8
8
|
flowtracks/format_docstrings.py,sha256=iJVJmtTUYEDEcmF5XSRZ08zpvlVc9lU66CZeqSpEKic,1987
|
|
9
9
|
flowtracks/future_idea_xarray_dask_zarr.py,sha256=4ZS6QuZ2s_sUaiCW0XBo74GrP5fw_clVyhWNjT5gbds,6101
|
|
10
|
-
flowtracks/graphics.py,sha256=
|
|
10
|
+
flowtracks/graphics.py,sha256=ulMTpPRGzQanAjna480XLMMQJL92Q4Wdtky8inqnwtE,13909
|
|
11
11
|
flowtracks/interpolation.py,sha256=njuB-bvWK5M2tc2Ibm6ZWNg6Tm6H-PTn0a63IldlJaA,39414
|
|
12
12
|
flowtracks/io.py,sha256=sujLgtY8WIymMZugDv2jlQeL9QR_hZn-MaZPPKsAPvA,48366
|
|
13
13
|
flowtracks/nhist.py,sha256=3xdrfSTSpTojXJcyhwBgagHBmKrm0U_AEsP3BjP9H1o,4089
|
|
@@ -25,29 +25,29 @@ flowtracks/stitching.py,sha256=HFsIRdAfqyhmES1OwIFslyWTF9U7kPJ5OKtjBl4YWqA,16895
|
|
|
25
25
|
flowtracks/trajectory.py,sha256=uL4-byZ2tycdrAwGoET4AfLHuKaWRnc8VHLO5zv9MOg,11831
|
|
26
26
|
flowtracks/vortex.py,sha256=4lG3QkvvnWhAHy4tl1pJrBGFLdrlP4pxNdhCZI1VZ4Q,2529
|
|
27
27
|
flowtracks/wall_shear.py,sha256=k9Q5FEchIO9J_onXPOw4PNJQfmsrSyVVvX4RdW-rQlE,6788
|
|
28
|
-
flowtracks/writers.py,sha256=
|
|
28
|
+
flowtracks/writers.py,sha256=0LnRiuqmyhcw8Ju3v9vCOERymNmxHG7cXKy6r8uLOTo,10358
|
|
29
29
|
flowtracks/zarr_scene.py,sha256=PKCtiTT1t0Hj74Q572ra5DM3uM8lQK1A6DzzfUxvIzI,10468
|
|
30
|
-
flowtracks-1.6.2.
|
|
31
|
-
flowtracks-1.6.2.
|
|
32
|
-
flowtracks-1.6.2.
|
|
33
|
-
flowtracks-1.6.2.
|
|
34
|
-
flowtracks-1.6.2.
|
|
35
|
-
flowtracks-1.6.2.
|
|
36
|
-
flowtracks-1.6.2.
|
|
37
|
-
flowtracks-1.6.2.
|
|
38
|
-
flowtracks-1.6.2.
|
|
39
|
-
flowtracks-1.6.2.
|
|
40
|
-
flowtracks-1.6.2.
|
|
41
|
-
flowtracks-1.6.2.
|
|
42
|
-
flowtracks-1.6.2.
|
|
43
|
-
flowtracks-1.6.2.
|
|
44
|
-
flowtracks-1.6.2.
|
|
45
|
-
flowtracks-1.6.2.
|
|
46
|
-
flowtracks-1.6.2.
|
|
47
|
-
flowtracks-1.6.2.
|
|
48
|
-
flowtracks-1.6.2.
|
|
49
|
-
flowtracks-1.6.2.
|
|
50
|
-
flowtracks-1.6.2.
|
|
51
|
-
flowtracks-1.6.2.
|
|
52
|
-
flowtracks-1.6.2.
|
|
53
|
-
flowtracks-1.6.2.
|
|
30
|
+
flowtracks-1.6.2.dev6.data/data/flowtracks-examples/batch_Lagrangian_to_Eulerian.py,sha256=e7mQFqyqvCeAHRKiN1IaxdNJi0e2FU84c7QNrx0L-m0,2296
|
|
31
|
+
flowtracks-1.6.2.dev6.data/data/flowtracks-examples/hdf5_scene_analysis.ipynb,sha256=jn0Z_ZVL1-iXaiKXwyAeb74NbXsBpnocCxCSDh814eU,243097
|
|
32
|
+
flowtracks-1.6.2.dev6.data/data/flowtracks-examples/linking_trajectories.ipynb,sha256=udz0GLDiPv68BYySg4yO1HWzaB9Sdy3YA3IhnIHDeII,8820
|
|
33
|
+
flowtracks-1.6.2.dev6.data/data/flowtracks-examples/marimo_dual_rig_trajectories.py,sha256=dzeK0C-knwq1bPOwo0p1RhWrb0RPp-T31rBaGEptXcc,6737
|
|
34
|
+
flowtracks-1.6.2.dev6.data/data/flowtracks-examples/marimo_flowtracks.py,sha256=7FIJNwBx9aBRmaM5ofmYTXSWEjE0wZqDfs8J47Tmw6U,9440
|
|
35
|
+
flowtracks-1.6.2.dev6.data/data/flowtracks-examples/marimo_hdf5_vs_zarr_scene_analysis.py,sha256=bjXlMsLJTxJ0JkvGcVZbuDOFYZU4OvdabtDUgqb15So,4536
|
|
36
|
+
flowtracks-1.6.2.dev6.data/data/flowtracks-examples/marimo_linking_trajectories_zarr.py,sha256=Ny_WUbiZWo0aKw-u2KGFWrhMv-8BvNgBy0UHIqCobYg,8210
|
|
37
|
+
flowtracks-1.6.2.dev6.data/data/flowtracks-examples/marimo_phase_averaging_demo.py,sha256=vg6j2ayKGl-5uj08bdzzb6pujzJJQ_5bUsG7UuPP7dM,9270
|
|
38
|
+
flowtracks-1.6.2.dev6.data/data/flowtracks-examples/marimo_phase_metrics.py,sha256=kBc2e_b-orDrm3AnuUXCcxsvmfQWyCtE826pFeolMGE,9367
|
|
39
|
+
flowtracks-1.6.2.dev6.data/data/flowtracks-examples/marimo_vtk_writers_preview.py,sha256=Otrhhp-QFf6F94EOs6rWu5xOCpbS16EfWy_iMFp7e_I,14611
|
|
40
|
+
flowtracks-1.6.2.dev6.data/data/flowtracks-examples/marimo_zarr_dashboard.py,sha256=jVIum6hdEelH4ef7vRgsfLhrbmMsuErsJBzxrnEImnw,9268
|
|
41
|
+
flowtracks-1.6.2.dev6.data/data/flowtracks-examples/repeated_interpolation.ipynb,sha256=t9SfoIWRu5XP0SrphWbQy508uzyEibVz61FGjl51fjA,8861
|
|
42
|
+
flowtracks-1.6.2.dev6.data/data/flowtracks-examples/run_pipeline.py,sha256=5fGE2tIP6XjFZ1sEYmqBujuLaXFfRL-rNnbr2p2CDfM,7205
|
|
43
|
+
flowtracks-1.6.2.dev6.data/data/flowtracks-examples/visualize_marimo.py,sha256=jWrg5IWjY-bmSQwQjaO5qTr0t_G48CsqJYpevdQrxeY,13026
|
|
44
|
+
flowtracks-1.6.2.dev6.data/data/flowtracks-examples/visualize_results.py,sha256=SbPg3EoDcuIyo0rUz3E-AnT4sLWDVJFhgC6xVcracW4,7583
|
|
45
|
+
flowtracks-1.6.2.dev6.data/scripts/analyse_fhdf.py,sha256=QH08NdImGukTEGuZEKFxjStcSelXBv-8A-22G6KtXqM,1315
|
|
46
|
+
flowtracks-1.6.2.dev6.dist-info/licenses/LICENSE.txt,sha256=jOtLnuWt7d5Hsx6XXB2QxzrSe2sWWh3NgMfFRetluQM,35147
|
|
47
|
+
flowtracks-1.6.2.dev6.dist-info/licenses/LICENSES/BSD-3-Clause.txt,sha256=XiJR9O5snDB6sAz0bcncOU6msceZgjPRxejWEQGg40Q,1505
|
|
48
|
+
flowtracks-1.6.2.dev6.dist-info/licenses/LICENSES/GPL-3.0-only.txt,sha256=jOtLnuWt7d5Hsx6XXB2QxzrSe2sWWh3NgMfFRetluQM,35147
|
|
49
|
+
flowtracks-1.6.2.dev6.dist-info/METADATA,sha256=jdbbG4k4qcw6lRlEaa1CvQrpWv21S7wDBffoIcyH3Cs,4773
|
|
50
|
+
flowtracks-1.6.2.dev6.dist-info/WHEEL,sha256=YVMoNqKzERt-wjUZwJ33xBGAwnFl-4cqbYkTtWa4itE,91
|
|
51
|
+
flowtracks-1.6.2.dev6.dist-info/entry_points.txt,sha256=U6028E7yQZQiZoXWMl7w4xgZUPwPxAGiAuuMB__c-yQ,60
|
|
52
|
+
flowtracks-1.6.2.dev6.dist-info/top_level.txt,sha256=cR54RNb9y2Wfr_BfuOezmNJOMB4GfIHh1-luXTREnQA,11
|
|
53
|
+
flowtracks-1.6.2.dev6.dist-info/RECORD,,
|
|
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
|
{flowtracks-1.6.2.dev4.data → flowtracks-1.6.2.dev6.data}/data/flowtracks-examples/run_pipeline.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
|