modal 0.74.48__tar.gz → 0.74.49__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.
Files changed (183) hide show
  1. {modal-0.74.48 → modal-0.74.49}/PKG-INFO +1 -1
  2. {modal-0.74.48 → modal-0.74.49}/modal/_utils/logger.py +16 -7
  3. {modal-0.74.48 → modal-0.74.49}/modal/client.pyi +2 -2
  4. {modal-0.74.48 → modal-0.74.49}/modal/config.py +6 -0
  5. {modal-0.74.48 → modal-0.74.49}/modal.egg-info/PKG-INFO +1 -1
  6. {modal-0.74.48 → modal-0.74.49}/modal_version/_version_generated.py +1 -1
  7. {modal-0.74.48 → modal-0.74.49}/LICENSE +0 -0
  8. {modal-0.74.48 → modal-0.74.49}/README.md +0 -0
  9. {modal-0.74.48 → modal-0.74.49}/modal/__init__.py +0 -0
  10. {modal-0.74.48 → modal-0.74.49}/modal/__main__.py +0 -0
  11. {modal-0.74.48 → modal-0.74.49}/modal/_clustered_functions.py +0 -0
  12. {modal-0.74.48 → modal-0.74.49}/modal/_clustered_functions.pyi +0 -0
  13. {modal-0.74.48 → modal-0.74.49}/modal/_container_entrypoint.py +0 -0
  14. {modal-0.74.48 → modal-0.74.49}/modal/_functions.py +0 -0
  15. {modal-0.74.48 → modal-0.74.49}/modal/_ipython.py +0 -0
  16. {modal-0.74.48 → modal-0.74.49}/modal/_location.py +0 -0
  17. {modal-0.74.48 → modal-0.74.49}/modal/_object.py +0 -0
  18. {modal-0.74.48 → modal-0.74.49}/modal/_output.py +0 -0
  19. {modal-0.74.48 → modal-0.74.49}/modal/_partial_function.py +0 -0
  20. {modal-0.74.48 → modal-0.74.49}/modal/_pty.py +0 -0
  21. {modal-0.74.48 → modal-0.74.49}/modal/_resolver.py +0 -0
  22. {modal-0.74.48 → modal-0.74.49}/modal/_resources.py +0 -0
  23. {modal-0.74.48 → modal-0.74.49}/modal/_runtime/__init__.py +0 -0
  24. {modal-0.74.48 → modal-0.74.49}/modal/_runtime/asgi.py +0 -0
  25. {modal-0.74.48 → modal-0.74.49}/modal/_runtime/container_io_manager.py +0 -0
  26. {modal-0.74.48 → modal-0.74.49}/modal/_runtime/container_io_manager.pyi +0 -0
  27. {modal-0.74.48 → modal-0.74.49}/modal/_runtime/execution_context.py +0 -0
  28. {modal-0.74.48 → modal-0.74.49}/modal/_runtime/execution_context.pyi +0 -0
  29. {modal-0.74.48 → modal-0.74.49}/modal/_runtime/gpu_memory_snapshot.py +0 -0
  30. {modal-0.74.48 → modal-0.74.49}/modal/_runtime/telemetry.py +0 -0
  31. {modal-0.74.48 → modal-0.74.49}/modal/_runtime/user_code_imports.py +0 -0
  32. {modal-0.74.48 → modal-0.74.49}/modal/_serialization.py +0 -0
  33. {modal-0.74.48 → modal-0.74.49}/modal/_traceback.py +0 -0
  34. {modal-0.74.48 → modal-0.74.49}/modal/_tunnel.py +0 -0
  35. {modal-0.74.48 → modal-0.74.49}/modal/_tunnel.pyi +0 -0
  36. {modal-0.74.48 → modal-0.74.49}/modal/_type_manager.py +0 -0
  37. {modal-0.74.48 → modal-0.74.49}/modal/_utils/__init__.py +0 -0
  38. {modal-0.74.48 → modal-0.74.49}/modal/_utils/app_utils.py +0 -0
  39. {modal-0.74.48 → modal-0.74.49}/modal/_utils/async_utils.py +0 -0
  40. {modal-0.74.48 → modal-0.74.49}/modal/_utils/blob_utils.py +0 -0
  41. {modal-0.74.48 → modal-0.74.49}/modal/_utils/bytes_io_segment_payload.py +0 -0
  42. {modal-0.74.48 → modal-0.74.49}/modal/_utils/deprecation.py +0 -0
  43. {modal-0.74.48 → modal-0.74.49}/modal/_utils/docker_utils.py +0 -0
  44. {modal-0.74.48 → modal-0.74.49}/modal/_utils/function_utils.py +0 -0
  45. {modal-0.74.48 → modal-0.74.49}/modal/_utils/git_utils.py +0 -0
  46. {modal-0.74.48 → modal-0.74.49}/modal/_utils/grpc_testing.py +0 -0
  47. {modal-0.74.48 → modal-0.74.49}/modal/_utils/grpc_utils.py +0 -0
  48. {modal-0.74.48 → modal-0.74.49}/modal/_utils/hash_utils.py +0 -0
  49. {modal-0.74.48 → modal-0.74.49}/modal/_utils/http_utils.py +0 -0
  50. {modal-0.74.48 → modal-0.74.49}/modal/_utils/jwt_utils.py +0 -0
  51. {modal-0.74.48 → modal-0.74.49}/modal/_utils/mount_utils.py +0 -0
  52. {modal-0.74.48 → modal-0.74.49}/modal/_utils/name_utils.py +0 -0
  53. {modal-0.74.48 → modal-0.74.49}/modal/_utils/package_utils.py +0 -0
  54. {modal-0.74.48 → modal-0.74.49}/modal/_utils/pattern_utils.py +0 -0
  55. {modal-0.74.48 → modal-0.74.49}/modal/_utils/rand_pb_testing.py +0 -0
  56. {modal-0.74.48 → modal-0.74.49}/modal/_utils/shell_utils.py +0 -0
  57. {modal-0.74.48 → modal-0.74.49}/modal/_vendor/__init__.py +0 -0
  58. {modal-0.74.48 → modal-0.74.49}/modal/_vendor/a2wsgi_wsgi.py +0 -0
  59. {modal-0.74.48 → modal-0.74.49}/modal/_vendor/cloudpickle.py +0 -0
  60. {modal-0.74.48 → modal-0.74.49}/modal/_vendor/tblib.py +0 -0
  61. {modal-0.74.48 → modal-0.74.49}/modal/_watcher.py +0 -0
  62. {modal-0.74.48 → modal-0.74.49}/modal/app.py +0 -0
  63. {modal-0.74.48 → modal-0.74.49}/modal/app.pyi +0 -0
  64. {modal-0.74.48 → modal-0.74.49}/modal/call_graph.py +0 -0
  65. {modal-0.74.48 → modal-0.74.49}/modal/cli/__init__.py +0 -0
  66. {modal-0.74.48 → modal-0.74.49}/modal/cli/_download.py +0 -0
  67. {modal-0.74.48 → modal-0.74.49}/modal/cli/_traceback.py +0 -0
  68. {modal-0.74.48 → modal-0.74.49}/modal/cli/app.py +0 -0
  69. {modal-0.74.48 → modal-0.74.49}/modal/cli/config.py +0 -0
  70. {modal-0.74.48 → modal-0.74.49}/modal/cli/container.py +0 -0
  71. {modal-0.74.48 → modal-0.74.49}/modal/cli/dict.py +0 -0
  72. {modal-0.74.48 → modal-0.74.49}/modal/cli/entry_point.py +0 -0
  73. {modal-0.74.48 → modal-0.74.49}/modal/cli/environment.py +0 -0
  74. {modal-0.74.48 → modal-0.74.49}/modal/cli/import_refs.py +0 -0
  75. {modal-0.74.48 → modal-0.74.49}/modal/cli/launch.py +0 -0
  76. {modal-0.74.48 → modal-0.74.49}/modal/cli/network_file_system.py +0 -0
  77. {modal-0.74.48 → modal-0.74.49}/modal/cli/profile.py +0 -0
  78. {modal-0.74.48 → modal-0.74.49}/modal/cli/programs/__init__.py +0 -0
  79. {modal-0.74.48 → modal-0.74.49}/modal/cli/programs/run_jupyter.py +0 -0
  80. {modal-0.74.48 → modal-0.74.49}/modal/cli/programs/vscode.py +0 -0
  81. {modal-0.74.48 → modal-0.74.49}/modal/cli/queues.py +0 -0
  82. {modal-0.74.48 → modal-0.74.49}/modal/cli/run.py +0 -0
  83. {modal-0.74.48 → modal-0.74.49}/modal/cli/secret.py +0 -0
  84. {modal-0.74.48 → modal-0.74.49}/modal/cli/token.py +0 -0
  85. {modal-0.74.48 → modal-0.74.49}/modal/cli/utils.py +0 -0
  86. {modal-0.74.48 → modal-0.74.49}/modal/cli/volume.py +0 -0
  87. {modal-0.74.48 → modal-0.74.49}/modal/client.py +0 -0
  88. {modal-0.74.48 → modal-0.74.49}/modal/cloud_bucket_mount.py +0 -0
  89. {modal-0.74.48 → modal-0.74.49}/modal/cloud_bucket_mount.pyi +0 -0
  90. {modal-0.74.48 → modal-0.74.49}/modal/cls.py +0 -0
  91. {modal-0.74.48 → modal-0.74.49}/modal/cls.pyi +0 -0
  92. {modal-0.74.48 → modal-0.74.49}/modal/container_process.py +0 -0
  93. {modal-0.74.48 → modal-0.74.49}/modal/container_process.pyi +0 -0
  94. {modal-0.74.48 → modal-0.74.49}/modal/dict.py +0 -0
  95. {modal-0.74.48 → modal-0.74.49}/modal/dict.pyi +0 -0
  96. {modal-0.74.48 → modal-0.74.49}/modal/environments.py +0 -0
  97. {modal-0.74.48 → modal-0.74.49}/modal/environments.pyi +0 -0
  98. {modal-0.74.48 → modal-0.74.49}/modal/exception.py +0 -0
  99. {modal-0.74.48 → modal-0.74.49}/modal/experimental/__init__.py +0 -0
  100. {modal-0.74.48 → modal-0.74.49}/modal/experimental/ipython.py +0 -0
  101. {modal-0.74.48 → modal-0.74.49}/modal/file_io.py +0 -0
  102. {modal-0.74.48 → modal-0.74.49}/modal/file_io.pyi +0 -0
  103. {modal-0.74.48 → modal-0.74.49}/modal/file_pattern_matcher.py +0 -0
  104. {modal-0.74.48 → modal-0.74.49}/modal/functions.py +0 -0
  105. {modal-0.74.48 → modal-0.74.49}/modal/functions.pyi +0 -0
  106. {modal-0.74.48 → modal-0.74.49}/modal/gpu.py +0 -0
  107. {modal-0.74.48 → modal-0.74.49}/modal/image.py +0 -0
  108. {modal-0.74.48 → modal-0.74.49}/modal/image.pyi +0 -0
  109. {modal-0.74.48 → modal-0.74.49}/modal/io_streams.py +0 -0
  110. {modal-0.74.48 → modal-0.74.49}/modal/io_streams.pyi +0 -0
  111. {modal-0.74.48 → modal-0.74.49}/modal/mount.py +0 -0
  112. {modal-0.74.48 → modal-0.74.49}/modal/mount.pyi +0 -0
  113. {modal-0.74.48 → modal-0.74.49}/modal/network_file_system.py +0 -0
  114. {modal-0.74.48 → modal-0.74.49}/modal/network_file_system.pyi +0 -0
  115. {modal-0.74.48 → modal-0.74.49}/modal/object.py +0 -0
  116. {modal-0.74.48 → modal-0.74.49}/modal/object.pyi +0 -0
  117. {modal-0.74.48 → modal-0.74.49}/modal/output.py +0 -0
  118. {modal-0.74.48 → modal-0.74.49}/modal/parallel_map.py +0 -0
  119. {modal-0.74.48 → modal-0.74.49}/modal/parallel_map.pyi +0 -0
  120. {modal-0.74.48 → modal-0.74.49}/modal/partial_function.py +0 -0
  121. {modal-0.74.48 → modal-0.74.49}/modal/partial_function.pyi +0 -0
  122. {modal-0.74.48 → modal-0.74.49}/modal/proxy.py +0 -0
  123. {modal-0.74.48 → modal-0.74.49}/modal/proxy.pyi +0 -0
  124. {modal-0.74.48 → modal-0.74.49}/modal/py.typed +0 -0
  125. {modal-0.74.48 → modal-0.74.49}/modal/queue.py +0 -0
  126. {modal-0.74.48 → modal-0.74.49}/modal/queue.pyi +0 -0
  127. {modal-0.74.48 → modal-0.74.49}/modal/requirements/2023.12.312.txt +0 -0
  128. {modal-0.74.48 → modal-0.74.49}/modal/requirements/2023.12.txt +0 -0
  129. {modal-0.74.48 → modal-0.74.49}/modal/requirements/2024.04.txt +0 -0
  130. {modal-0.74.48 → modal-0.74.49}/modal/requirements/2024.10.txt +0 -0
  131. {modal-0.74.48 → modal-0.74.49}/modal/requirements/PREVIEW.txt +0 -0
  132. {modal-0.74.48 → modal-0.74.49}/modal/requirements/README.md +0 -0
  133. {modal-0.74.48 → modal-0.74.49}/modal/requirements/base-images.json +0 -0
  134. {modal-0.74.48 → modal-0.74.49}/modal/retries.py +0 -0
  135. {modal-0.74.48 → modal-0.74.49}/modal/runner.py +0 -0
  136. {modal-0.74.48 → modal-0.74.49}/modal/runner.pyi +0 -0
  137. {modal-0.74.48 → modal-0.74.49}/modal/running_app.py +0 -0
  138. {modal-0.74.48 → modal-0.74.49}/modal/sandbox.py +0 -0
  139. {modal-0.74.48 → modal-0.74.49}/modal/sandbox.pyi +0 -0
  140. {modal-0.74.48 → modal-0.74.49}/modal/schedule.py +0 -0
  141. {modal-0.74.48 → modal-0.74.49}/modal/scheduler_placement.py +0 -0
  142. {modal-0.74.48 → modal-0.74.49}/modal/secret.py +0 -0
  143. {modal-0.74.48 → modal-0.74.49}/modal/secret.pyi +0 -0
  144. {modal-0.74.48 → modal-0.74.49}/modal/serving.py +0 -0
  145. {modal-0.74.48 → modal-0.74.49}/modal/serving.pyi +0 -0
  146. {modal-0.74.48 → modal-0.74.49}/modal/snapshot.py +0 -0
  147. {modal-0.74.48 → modal-0.74.49}/modal/snapshot.pyi +0 -0
  148. {modal-0.74.48 → modal-0.74.49}/modal/stream_type.py +0 -0
  149. {modal-0.74.48 → modal-0.74.49}/modal/token_flow.py +0 -0
  150. {modal-0.74.48 → modal-0.74.49}/modal/token_flow.pyi +0 -0
  151. {modal-0.74.48 → modal-0.74.49}/modal/volume.py +0 -0
  152. {modal-0.74.48 → modal-0.74.49}/modal/volume.pyi +0 -0
  153. {modal-0.74.48 → modal-0.74.49}/modal.egg-info/SOURCES.txt +0 -0
  154. {modal-0.74.48 → modal-0.74.49}/modal.egg-info/dependency_links.txt +0 -0
  155. {modal-0.74.48 → modal-0.74.49}/modal.egg-info/entry_points.txt +0 -0
  156. {modal-0.74.48 → modal-0.74.49}/modal.egg-info/requires.txt +0 -0
  157. {modal-0.74.48 → modal-0.74.49}/modal.egg-info/top_level.txt +0 -0
  158. {modal-0.74.48 → modal-0.74.49}/modal_docs/__init__.py +0 -0
  159. {modal-0.74.48 → modal-0.74.49}/modal_docs/gen_cli_docs.py +0 -0
  160. {modal-0.74.48 → modal-0.74.49}/modal_docs/gen_reference_docs.py +0 -0
  161. {modal-0.74.48 → modal-0.74.49}/modal_docs/mdmd/__init__.py +0 -0
  162. {modal-0.74.48 → modal-0.74.49}/modal_docs/mdmd/mdmd.py +0 -0
  163. {modal-0.74.48 → modal-0.74.49}/modal_docs/mdmd/signatures.py +0 -0
  164. {modal-0.74.48 → modal-0.74.49}/modal_proto/__init__.py +0 -0
  165. {modal-0.74.48 → modal-0.74.49}/modal_proto/api.proto +0 -0
  166. {modal-0.74.48 → modal-0.74.49}/modal_proto/api_grpc.py +0 -0
  167. {modal-0.74.48 → modal-0.74.49}/modal_proto/api_pb2.py +0 -0
  168. {modal-0.74.48 → modal-0.74.49}/modal_proto/api_pb2.pyi +0 -0
  169. {modal-0.74.48 → modal-0.74.49}/modal_proto/api_pb2_grpc.py +0 -0
  170. {modal-0.74.48 → modal-0.74.49}/modal_proto/api_pb2_grpc.pyi +0 -0
  171. {modal-0.74.48 → modal-0.74.49}/modal_proto/modal_api_grpc.py +0 -0
  172. {modal-0.74.48 → modal-0.74.49}/modal_proto/modal_options_grpc.py +0 -0
  173. {modal-0.74.48 → modal-0.74.49}/modal_proto/options.proto +0 -0
  174. {modal-0.74.48 → modal-0.74.49}/modal_proto/options_grpc.py +0 -0
  175. {modal-0.74.48 → modal-0.74.49}/modal_proto/options_pb2.py +0 -0
  176. {modal-0.74.48 → modal-0.74.49}/modal_proto/options_pb2.pyi +0 -0
  177. {modal-0.74.48 → modal-0.74.49}/modal_proto/options_pb2_grpc.py +0 -0
  178. {modal-0.74.48 → modal-0.74.49}/modal_proto/options_pb2_grpc.pyi +0 -0
  179. {modal-0.74.48 → modal-0.74.49}/modal_proto/py.typed +0 -0
  180. {modal-0.74.48 → modal-0.74.49}/modal_version/__init__.py +0 -0
  181. {modal-0.74.48 → modal-0.74.49}/modal_version/__main__.py +0 -0
  182. {modal-0.74.48 → modal-0.74.49}/pyproject.toml +0 -0
  183. {modal-0.74.48 → modal-0.74.49}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 0.74.48
3
+ Version: 0.74.49
4
4
  Summary: Python client library for Modal
5
5
  Author-email: Modal Labs <support@modal.com>
6
6
  License: Apache-2.0
@@ -4,33 +4,42 @@ import os
4
4
 
5
5
 
6
6
  def configure_logger(logger: logging.Logger, log_level: str, log_format: str):
7
+ from modal.config import config
8
+
7
9
  ch = logging.StreamHandler()
8
10
  log_level_numeric = logging.getLevelName(log_level.upper())
9
11
  logger.setLevel(log_level_numeric)
10
12
  ch.setLevel(log_level_numeric)
11
-
13
+ datefmt = "%Y-%m-%dT%H:%M:%S%z"
12
14
  if log_format.upper() == "JSON":
13
15
  # This is primarily for modal internal use.
14
16
  # pythonjsonlogger is already installed in the environment.
15
17
  from pythonjsonlogger import jsonlogger
16
18
 
17
- json_formatter = jsonlogger.JsonFormatter(
18
- fmt=(
19
+ if not (log_format_pattern := config.get("log_pattern")):
20
+ log_format_pattern = (
19
21
  "%(asctime)s %(levelname)s [%(name)s] [%(filename)s:%(lineno)d] "
20
22
  "[dd.service=%(dd.service)s dd.env=%(dd.env)s dd.version=%(dd.version)s dd.trace_id=%(dd.trace_id)s "
21
23
  "dd.span_id=%(dd.span_id)s] "
22
24
  "- %(message)s"
23
- ),
24
- datefmt="%Y-%m-%dT%H:%M:%S%z",
25
- )
25
+ )
26
26
 
27
+ json_formatter = jsonlogger.JsonFormatter(
28
+ fmt=log_format_pattern,
29
+ datefmt=datefmt,
30
+ )
27
31
  ch.setFormatter(json_formatter)
28
32
  else:
29
- ch.setFormatter(logging.Formatter("[%(threadName)s] %(asctime)s %(message)s", datefmt="%Y-%m-%dT%H:%M:%S%z"))
33
+ if not (log_format_pattern := config.get("log_pattern")):
34
+ # TODO: use `%(name)s` instead of `modal-client` as soon as we unify the loggers we use
35
+ log_format_pattern = "[modal-client] %(asctime)s %(message)s"
36
+
37
+ ch.setFormatter(logging.Formatter(log_format_pattern, datefmt=datefmt))
30
38
 
31
39
  logger.addHandler(ch)
32
40
 
33
41
 
42
+ # TODO: remove this distinct logger in favor of the one in modal.config?
34
43
  log_level = os.environ.get("MODAL_LOGLEVEL", "WARNING")
35
44
  log_format = os.environ.get("MODAL_LOG_FORMAT", "STRING")
36
45
 
@@ -27,7 +27,7 @@ class _Client:
27
27
  _snapshotted: bool
28
28
 
29
29
  def __init__(
30
- self, server_url: str, client_type: int, credentials: typing.Optional[tuple[str, str]], version: str = "0.74.48"
30
+ self, server_url: str, client_type: int, credentials: typing.Optional[tuple[str, str]], version: str = "0.74.49"
31
31
  ): ...
32
32
  def is_closed(self) -> bool: ...
33
33
  @property
@@ -85,7 +85,7 @@ class Client:
85
85
  _snapshotted: bool
86
86
 
87
87
  def __init__(
88
- self, server_url: str, client_type: int, credentials: typing.Optional[tuple[str, str]], version: str = "0.74.48"
88
+ self, server_url: str, client_type: int, credentials: typing.Optional[tuple[str, str]], version: str = "0.74.49"
89
89
  ): ...
90
90
  def is_closed(self) -> bool: ...
91
91
  @property
@@ -70,6 +70,11 @@ Other possible configuration options are:
70
70
  * `traceback` (in the .toml file) / `MODAL_TRACEBACK` (as an env var).
71
71
  Defaults to False. Enables printing full tracebacks on unexpected CLI
72
72
  errors, which can be useful for debugging client issues.
73
+ * `log_pattern` (in the .toml file) / MODAL_LOG_PATTERN` (as an env var).
74
+ Defaults to "[modal-client] %(asctime)s %(message)s"
75
+ The log formatting pattern that will be used by the modal client itself.
76
+ See https://docs.python.org/3/library/logging.html#logrecord-attributes for available
77
+ log attributes.
73
78
 
74
79
  Meta-configuration
75
80
  ------------------
@@ -216,6 +221,7 @@ class _Setting(typing.NamedTuple):
216
221
  _SETTINGS = {
217
222
  "loglevel": _Setting("WARNING", lambda s: s.upper()),
218
223
  "log_format": _Setting("STRING", lambda s: s.upper()),
224
+ "log_pattern": _Setting(), # optional override of the formatting pattern
219
225
  "server_url": _Setting("https://api.modal.com"),
220
226
  "token_id": _Setting(),
221
227
  "token_secret": _Setting(),
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 0.74.48
3
+ Version: 0.74.49
4
4
  Summary: Python client library for Modal
5
5
  Author-email: Modal Labs <support@modal.com>
6
6
  License: Apache-2.0
@@ -1,4 +1,4 @@
1
1
  # Copyright Modal Labs 2025
2
2
 
3
3
  # Note: Reset this value to -1 whenever you make a minor `0.X` release of the client.
4
- build_number = 48 # git: c91fb0e
4
+ build_number = 49 # git: b2ad6b8
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
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