python-selve-new 2.5.7__tar.gz → 2.5.8__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.
- {python_selve_new-2.5.7 → python_selve_new-2.5.8}/PKG-INFO +1 -1
- {python_selve_new-2.5.7 → python_selve_new-2.5.8}/python_selve_new.egg-info/PKG-INFO +1 -1
- {python_selve_new-2.5.7 → python_selve_new-2.5.8}/selve/_version.py +3 -3
- {python_selve_new-2.5.7 → python_selve_new-2.5.8}/selve/util/serial_transport.py +34 -1
- {python_selve_new-2.5.7 → python_selve_new-2.5.8}/.github/FUNDING.yml +0 -0
- {python_selve_new-2.5.7 → python_selve_new-2.5.8}/.github/architect.chatmode.md +0 -0
- {python_selve_new-2.5.7 → python_selve_new-2.5.8}/.github/ask.chatmode.md +0 -0
- {python_selve_new-2.5.7 → python_selve_new-2.5.8}/.github/code.chatmode.md +0 -0
- {python_selve_new-2.5.7 → python_selve_new-2.5.8}/.github/debug.chatmode.md +0 -0
- {python_selve_new-2.5.7 → python_selve_new-2.5.8}/.github/workflows/python-publish.yml +0 -0
- {python_selve_new-2.5.7 → python_selve_new-2.5.8}/.github/workflows/tests.yml +0 -0
- {python_selve_new-2.5.7 → python_selve_new-2.5.8}/.gitignore +0 -0
- {python_selve_new-2.5.7 → python_selve_new-2.5.8}/.idea/.gitignore +0 -0
- {python_selve_new-2.5.7 → python_selve_new-2.5.8}/.idea/inspectionProfiles/profiles_settings.xml +0 -0
- {python_selve_new-2.5.7 → python_selve_new-2.5.8}/.idea/misc.xml +0 -0
- {python_selve_new-2.5.7 → python_selve_new-2.5.8}/.idea/modules.xml +0 -0
- {python_selve_new-2.5.7 → python_selve_new-2.5.8}/.idea/python-selve-new.iml +0 -0
- {python_selve_new-2.5.7 → python_selve_new-2.5.8}/.idea/vcs.xml +0 -0
- {python_selve_new-2.5.7 → python_selve_new-2.5.8}/CHANGELOG.md +0 -0
- {python_selve_new-2.5.7 → python_selve_new-2.5.8}/LICENSE +0 -0
- {python_selve_new-2.5.7 → python_selve_new-2.5.8}/README.md +0 -0
- {python_selve_new-2.5.7 → python_selve_new-2.5.8}/coverage_xdist_example.txt +0 -0
- {python_selve_new-2.5.7 → python_selve_new-2.5.8}/debug_response.py +0 -0
- {python_selve_new-2.5.7 → python_selve_new-2.5.8}/debug_test.bat +0 -0
- {python_selve_new-2.5.7 → python_selve_new-2.5.8}/direct_hardware_test.bat +0 -0
- {python_selve_new-2.5.7 → python_selve_new-2.5.8}/direct_hardware_test.py +0 -0
- {python_selve_new-2.5.7 → python_selve_new-2.5.8}/generate_coverage.bat +0 -0
- {python_selve_new-2.5.7 → python_selve_new-2.5.8}/package.sh +0 -0
- {python_selve_new-2.5.7 → python_selve_new-2.5.8}/pyproject.toml +0 -0
- {python_selve_new-2.5.7 → python_selve_new-2.5.8}/python_selve_new.egg-info/SOURCES.txt +0 -0
- {python_selve_new-2.5.7 → python_selve_new-2.5.8}/python_selve_new.egg-info/dependency_links.txt +0 -0
- {python_selve_new-2.5.7 → python_selve_new-2.5.8}/python_selve_new.egg-info/requires.txt +0 -0
- {python_selve_new-2.5.7 → python_selve_new-2.5.8}/python_selve_new.egg-info/top_level.txt +0 -0
- {python_selve_new-2.5.7 → python_selve_new-2.5.8}/release.py +0 -0
- {python_selve_new-2.5.7 → python_selve_new-2.5.8}/run_all_tests.bat +0 -0
- {python_selve_new-2.5.7 → python_selve_new-2.5.8}/run_hardware_tests.bat +0 -0
- {python_selve_new-2.5.7 → python_selve_new-2.5.8}/run_integration_tests.bat +0 -0
- {python_selve_new-2.5.7 → python_selve_new-2.5.8}/run_mock_tests.bat +0 -0
- {python_selve_new-2.5.7 → python_selve_new-2.5.8}/run_single_test.bat +0 -0
- {python_selve_new-2.5.7 → python_selve_new-2.5.8}/run_tests.bat +0 -0
- {python_selve_new-2.5.7 → python_selve_new-2.5.8}/selve/__init__.py +0 -0
- {python_selve_new-2.5.7 → python_selve_new-2.5.8}/selve/commands/__init__.py +0 -0
- {python_selve_new-2.5.7 → python_selve_new-2.5.8}/selve/commands/command.py +0 -0
- {python_selve_new-2.5.7 → python_selve_new-2.5.8}/selve/commands/device.py +0 -0
- {python_selve_new-2.5.7 → python_selve_new-2.5.8}/selve/commands/event.py +0 -0
- {python_selve_new-2.5.7 → python_selve_new-2.5.8}/selve/commands/firmware.py +0 -0
- {python_selve_new-2.5.7 → python_selve_new-2.5.8}/selve/commands/group.py +0 -0
- {python_selve_new-2.5.7 → python_selve_new-2.5.8}/selve/commands/iveo.py +0 -0
- {python_selve_new-2.5.7 → python_selve_new-2.5.8}/selve/commands/param.py +0 -0
- {python_selve_new-2.5.7 → python_selve_new-2.5.8}/selve/commands/senSim.py +0 -0
- {python_selve_new-2.5.7 → python_selve_new-2.5.8}/selve/commands/sender.py +0 -0
- {python_selve_new-2.5.7 → python_selve_new-2.5.8}/selve/commands/sensor.py +0 -0
- {python_selve_new-2.5.7 → python_selve_new-2.5.8}/selve/commands/service.py +0 -0
- {python_selve_new-2.5.7 → python_selve_new-2.5.8}/selve/device.py +0 -0
- {python_selve_new-2.5.7 → python_selve_new-2.5.8}/selve/gateway.py +0 -0
- {python_selve_new-2.5.7 → python_selve_new-2.5.8}/selve/group.py +0 -0
- {python_selve_new-2.5.7 → python_selve_new-2.5.8}/selve/iveo.py +0 -0
- {python_selve_new-2.5.7 → python_selve_new-2.5.8}/selve/senSim.py +0 -0
- {python_selve_new-2.5.7 → python_selve_new-2.5.8}/selve/sender.py +0 -0
- {python_selve_new-2.5.7 → python_selve_new-2.5.8}/selve/sensor.py +0 -0
- {python_selve_new-2.5.7 → python_selve_new-2.5.8}/selve/util/__init__.py +0 -0
- {python_selve_new-2.5.7 → python_selve_new-2.5.8}/selve/util/errors.py +0 -0
- {python_selve_new-2.5.7 → python_selve_new-2.5.8}/selve/util/protocol.py +0 -0
- {python_selve_new-2.5.7 → python_selve_new-2.5.8}/setup.cfg +0 -0
- {python_selve_new-2.5.7 → python_selve_new-2.5.8}/setup.py +0 -0
- {python_selve_new-2.5.7 → python_selve_new-2.5.8}/setup_and_test.bat +0 -0
- {python_selve_new-2.5.7 → python_selve_new-2.5.8}/tests/__init__.py +0 -0
- {python_selve_new-2.5.7 → python_selve_new-2.5.8}/tests/conftest.py +0 -0
- {python_selve_new-2.5.7 → python_selve_new-2.5.8}/tests/integration/README.md +0 -0
- {python_selve_new-2.5.7 → python_selve_new-2.5.8}/tests/integration/__init__.py +0 -0
- {python_selve_new-2.5.7 → python_selve_new-2.5.8}/tests/integration/conftest.py +0 -0
- {python_selve_new-2.5.7 → python_selve_new-2.5.8}/tests/integration/test_device_integration.py +0 -0
- {python_selve_new-2.5.7 → python_selve_new-2.5.8}/tests/integration/test_selve_gateway_integration.py +0 -0
- {python_selve_new-2.5.7 → python_selve_new-2.5.8}/tests/integration/test_selve_hardware.py +0 -0
- {python_selve_new-2.5.7 → python_selve_new-2.5.8}/tests/integration/test_selve_integration.py +0 -0
- {python_selve_new-2.5.7 → python_selve_new-2.5.8}/tests/test_import.py +0 -0
- {python_selve_new-2.5.7 → python_selve_new-2.5.8}/tests/test_replacement.py +0 -0
- {python_selve_new-2.5.7 → python_selve_new-2.5.8}/tests/unit/__init__.py +0 -0
- {python_selve_new-2.5.7 → python_selve_new-2.5.8}/tests/unit/mock_utils.py +0 -0
- {python_selve_new-2.5.7 → python_selve_new-2.5.8}/tests/unit/test_command_coverage.py +0 -0
- {python_selve_new-2.5.7 → python_selve_new-2.5.8}/tests/unit/test_commands.py +0 -0
- {python_selve_new-2.5.7 → python_selve_new-2.5.8}/tests/unit/test_device.py +0 -0
- {python_selve_new-2.5.7 → python_selve_new-2.5.8}/tests/unit/test_device_classes_coverage.py +0 -0
- {python_selve_new-2.5.7 → python_selve_new-2.5.8}/tests/unit/test_device_commands_extended.py +0 -0
- {python_selve_new-2.5.7 → python_selve_new-2.5.8}/tests/unit/test_gateway_configuration_issues.py +0 -0
- {python_selve_new-2.5.7 → python_selve_new-2.5.8}/tests/unit/test_gateway_error_handling_fixed.py +0 -0
- {python_selve_new-2.5.7 → python_selve_new-2.5.8}/tests/unit/test_group.py +0 -0
- {python_selve_new-2.5.7 → python_selve_new-2.5.8}/tests/unit/test_group_commands.py +0 -0
- {python_selve_new-2.5.7 → python_selve_new-2.5.8}/tests/unit/test_missing_components.py +0 -0
- {python_selve_new-2.5.7 → python_selve_new-2.5.8}/tests/unit/test_mock_commands.py +0 -0
- {python_selve_new-2.5.7 → python_selve_new-2.5.8}/tests/unit/test_mock_devices_and_groups.py +0 -0
- {python_selve_new-2.5.7 → python_selve_new-2.5.8}/tests/unit/test_mock_sensors_and_senders.py +0 -0
- {python_selve_new-2.5.7 → python_selve_new-2.5.8}/tests/unit/test_param_commands_extended.py +0 -0
- {python_selve_new-2.5.7 → python_selve_new-2.5.8}/tests/unit/test_port_discovery.py +0 -0
- {python_selve_new-2.5.7 → python_selve_new-2.5.8}/tests/unit/test_selve_advanced_coverage.py +0 -0
- {python_selve_new-2.5.7 → python_selve_new-2.5.8}/tests/unit/test_selve_core_coverage.py +0 -0
- {python_selve_new-2.5.7 → python_selve_new-2.5.8}/tests/unit/test_selve_edge_cases.py +0 -0
- {python_selve_new-2.5.7 → python_selve_new-2.5.8}/tests/unit/test_selve_gateway.py +0 -0
- {python_selve_new-2.5.7 → python_selve_new-2.5.8}/tests/unit/test_selve_init_comprehensive.py +0 -0
- {python_selve_new-2.5.7 → python_selve_new-2.5.8}/tests/unit/test_selve_init_response_coverage.py +0 -0
- {python_selve_new-2.5.7 → python_selve_new-2.5.8}/tests/unit/test_selve_init_simple.py +0 -0
- {python_selve_new-2.5.7 → python_selve_new-2.5.8}/tests/unit/test_selve_main_class_extensive.py +0 -0
- {python_selve_new-2.5.7 → python_selve_new-2.5.8}/tests/unit/test_sender_commands_extended.py +0 -0
- {python_selve_new-2.5.7 → python_selve_new-2.5.8}/tests/unit/test_sensim_commands_extended.py +0 -0
- {python_selve_new-2.5.7 → python_selve_new-2.5.8}/tests/unit/test_sensor_commands_extended.py +0 -0
- {python_selve_new-2.5.7 → python_selve_new-2.5.8}/tests/unit/test_service_command_errors.py +0 -0
- {python_selve_new-2.5.7 → python_selve_new-2.5.8}/tests/unit/test_service_commands.py +0 -0
- {python_selve_new-2.5.7 → python_selve_new-2.5.8}/tests/unit/test_util.py +0 -0
- {python_selve_new-2.5.7 → python_selve_new-2.5.8}/tests/unit/test_utility_coverage.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: python-selve-new
|
|
3
|
-
Version: 2.5.
|
|
3
|
+
Version: 2.5.8
|
|
4
4
|
Summary: Python library for interfacing with selve devices using the USB-RF controller. Written completely new.
|
|
5
5
|
Home-page: https://github.com/Kannix2005/python-selve-new
|
|
6
6
|
Author: Stefan Altheimer
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: python-selve-new
|
|
3
|
-
Version: 2.5.
|
|
3
|
+
Version: 2.5.8
|
|
4
4
|
Summary: Python library for interfacing with selve devices using the USB-RF controller. Written completely new.
|
|
5
5
|
Home-page: https://github.com/Kannix2005/python-selve-new
|
|
6
6
|
Author: Stefan Altheimer
|
|
@@ -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 = '2.5.
|
|
22
|
-
__version_tuple__ = version_tuple = (2, 5,
|
|
21
|
+
__version__ = version = '2.5.8'
|
|
22
|
+
__version_tuple__ = version_tuple = (2, 5, 8)
|
|
23
23
|
|
|
24
|
-
__commit_id__ = commit_id = '
|
|
24
|
+
__commit_id__ = commit_id = 'g2562749e3'
|
|
@@ -5,6 +5,8 @@ from typing import Optional
|
|
|
5
5
|
import serialx
|
|
6
6
|
from serialx import Parity
|
|
7
7
|
|
|
8
|
+
_READLINE_TIMEOUT = 12.0 # seconds — gateway goes silent during RF motor ops
|
|
9
|
+
|
|
8
10
|
|
|
9
11
|
class SerialTransport:
|
|
10
12
|
"""Async serial transport using serialx (replaces pyserial + background thread)."""
|
|
@@ -36,6 +38,7 @@ class SerialTransport:
|
|
|
36
38
|
|
|
37
39
|
async def ensure_open(self) -> None:
|
|
38
40
|
if not self.is_open:
|
|
41
|
+
self._logger.info("Serial: opening %s", self._port)
|
|
39
42
|
self._reader, self._writer = await serialx.open_serial_connection(
|
|
40
43
|
url=self._port,
|
|
41
44
|
baudrate=self._baudrate,
|
|
@@ -46,8 +49,10 @@ class SerialTransport:
|
|
|
46
49
|
rtscts=False,
|
|
47
50
|
dsrdtr=False,
|
|
48
51
|
)
|
|
52
|
+
self._logger.info("Serial: %s opened, reader=%r writer=%r", self._port, self._reader, self._writer)
|
|
49
53
|
|
|
50
54
|
async def close(self) -> None:
|
|
55
|
+
self._logger.info("Serial: closing %s", self._port)
|
|
51
56
|
try:
|
|
52
57
|
if self._writer and not self._writer.is_closing():
|
|
53
58
|
self._writer.close()
|
|
@@ -56,34 +61,60 @@ class SerialTransport:
|
|
|
56
61
|
self._logger.debug("Serial close failed", exc_info=True)
|
|
57
62
|
self._reader = None
|
|
58
63
|
self._writer = None
|
|
64
|
+
self._logger.info("Serial: %s closed", self._port)
|
|
59
65
|
|
|
60
66
|
async def start_reader(self, rx_queue: asyncio.Queue) -> None:
|
|
61
67
|
"""Opens the serial port and starts the async reader task."""
|
|
62
68
|
await self.ensure_open()
|
|
63
69
|
self._rx_queue = rx_queue
|
|
64
70
|
if self._reader_task and not self._reader_task.done():
|
|
71
|
+
self._logger.info("Serial: reader task already running")
|
|
65
72
|
return
|
|
73
|
+
self._logger.info("Serial: starting reader task, reader=%r", self._reader)
|
|
66
74
|
self._reader_task = asyncio.create_task(
|
|
67
75
|
self._reader_loop(), name="selve-serial-reader"
|
|
68
76
|
)
|
|
69
77
|
|
|
70
78
|
async def stop_reader(self) -> None:
|
|
71
79
|
if self._reader_task:
|
|
80
|
+
self._logger.info("Serial: stopping reader task")
|
|
72
81
|
self._reader_task.cancel()
|
|
73
82
|
try:
|
|
74
83
|
await self._reader_task
|
|
75
84
|
except asyncio.CancelledError:
|
|
76
85
|
pass
|
|
77
86
|
self._reader_task = None
|
|
87
|
+
self._logger.info("Serial: reader task stopped")
|
|
78
88
|
|
|
79
89
|
async def _reader_loop(self) -> None:
|
|
90
|
+
self._logger.info("Serial: reader loop started, reader=%r at_eof=%s",
|
|
91
|
+
self._reader,
|
|
92
|
+
self._reader.at_eof() if self._reader else "N/A")
|
|
80
93
|
buffer = ""
|
|
94
|
+
iteration = 0
|
|
81
95
|
while True:
|
|
82
96
|
try:
|
|
83
97
|
if self._reader is None:
|
|
98
|
+
self._logger.warning("Serial: reader is None in loop, reopening")
|
|
84
99
|
await self.ensure_open()
|
|
85
|
-
|
|
100
|
+
self._logger.debug("Serial: awaiting readline (iter=%d, buf=%r)", iteration, buffer)
|
|
101
|
+
line_bytes = await asyncio.wait_for(
|
|
102
|
+
self._reader.readline(), timeout=_READLINE_TIMEOUT
|
|
103
|
+
)
|
|
104
|
+
self._logger.debug("Serial: readline returned %d bytes (iter=%d)", len(line_bytes), iteration)
|
|
105
|
+
iteration += 1
|
|
106
|
+
except asyncio.TimeoutError:
|
|
107
|
+
self._logger.warning(
|
|
108
|
+
"Serial: readline timeout after %.0fs (iter=%d, buf=%r) — reconnecting",
|
|
109
|
+
_READLINE_TIMEOUT, iteration, buffer,
|
|
110
|
+
)
|
|
111
|
+
buffer = ""
|
|
112
|
+
await self.close()
|
|
113
|
+
await asyncio.sleep(1.0)
|
|
114
|
+
await self.ensure_open()
|
|
115
|
+
continue
|
|
86
116
|
except asyncio.CancelledError:
|
|
117
|
+
self._logger.info("Serial: reader loop cancelled")
|
|
87
118
|
break
|
|
88
119
|
except (OSError, EOFError) as exc:
|
|
89
120
|
self._logger.error("Serial read error: %s", exc)
|
|
@@ -95,6 +126,8 @@ class SerialTransport:
|
|
|
95
126
|
continue
|
|
96
127
|
|
|
97
128
|
if not line_bytes:
|
|
129
|
+
self._logger.debug("Serial: readline returned empty bytes (EOF?), reader.at_eof=%s",
|
|
130
|
+
self._reader.at_eof() if self._reader else "N/A")
|
|
98
131
|
await asyncio.sleep(0.01)
|
|
99
132
|
continue
|
|
100
133
|
|
|
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
|
{python_selve_new-2.5.7 → python_selve_new-2.5.8}/.idea/inspectionProfiles/profiles_settings.xml
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
|
{python_selve_new-2.5.7 → python_selve_new-2.5.8}/python_selve_new.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
|
|
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
|
{python_selve_new-2.5.7 → python_selve_new-2.5.8}/tests/integration/test_device_integration.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{python_selve_new-2.5.7 → python_selve_new-2.5.8}/tests/integration/test_selve_integration.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
|
{python_selve_new-2.5.7 → python_selve_new-2.5.8}/tests/unit/test_device_classes_coverage.py
RENAMED
|
File without changes
|
{python_selve_new-2.5.7 → python_selve_new-2.5.8}/tests/unit/test_device_commands_extended.py
RENAMED
|
File without changes
|
{python_selve_new-2.5.7 → python_selve_new-2.5.8}/tests/unit/test_gateway_configuration_issues.py
RENAMED
|
File without changes
|
{python_selve_new-2.5.7 → python_selve_new-2.5.8}/tests/unit/test_gateway_error_handling_fixed.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{python_selve_new-2.5.7 → python_selve_new-2.5.8}/tests/unit/test_mock_devices_and_groups.py
RENAMED
|
File without changes
|
{python_selve_new-2.5.7 → python_selve_new-2.5.8}/tests/unit/test_mock_sensors_and_senders.py
RENAMED
|
File without changes
|
{python_selve_new-2.5.7 → python_selve_new-2.5.8}/tests/unit/test_param_commands_extended.py
RENAMED
|
File without changes
|
|
File without changes
|
{python_selve_new-2.5.7 → python_selve_new-2.5.8}/tests/unit/test_selve_advanced_coverage.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{python_selve_new-2.5.7 → python_selve_new-2.5.8}/tests/unit/test_selve_init_comprehensive.py
RENAMED
|
File without changes
|
{python_selve_new-2.5.7 → python_selve_new-2.5.8}/tests/unit/test_selve_init_response_coverage.py
RENAMED
|
File without changes
|
|
File without changes
|
{python_selve_new-2.5.7 → python_selve_new-2.5.8}/tests/unit/test_selve_main_class_extensive.py
RENAMED
|
File without changes
|
{python_selve_new-2.5.7 → python_selve_new-2.5.8}/tests/unit/test_sender_commands_extended.py
RENAMED
|
File without changes
|
{python_selve_new-2.5.7 → python_selve_new-2.5.8}/tests/unit/test_sensim_commands_extended.py
RENAMED
|
File without changes
|
{python_selve_new-2.5.7 → python_selve_new-2.5.8}/tests/unit/test_sensor_commands_extended.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|