bear-utils 0.7.15__tar.gz → 0.7.17__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 (94) hide show
  1. {bear_utils-0.7.15 → bear_utils-0.7.17}/.bumpversion.cfg +1 -1
  2. {bear_utils-0.7.15 → bear_utils-0.7.17}/PKG-INFO +3 -2
  3. {bear_utils-0.7.15 → bear_utils-0.7.17}/README.md +1 -1
  4. {bear_utils-0.7.15 → bear_utils-0.7.17}/pyproject.toml +2 -1
  5. {bear_utils-0.7.15 → bear_utils-0.7.17}/src/bear_utils/cli/shell/_base_shell.py +2 -1
  6. {bear_utils-0.7.15 → bear_utils-0.7.17}/src/bear_utils/files/file_handlers/file_handler_factory.py +2 -0
  7. bear_utils-0.7.17/src/bear_utils/files/file_handlers/toml_file_handler.py +68 -0
  8. {bear_utils-0.7.15 → bear_utils-0.7.17}/uv.lock +15 -4
  9. bear_utils-0.7.15/test.py +0 -24
  10. {bear_utils-0.7.15 → bear_utils-0.7.17}/.gitignore +0 -0
  11. {bear_utils-0.7.15 → bear_utils-0.7.17}/.python-version +0 -0
  12. {bear_utils-0.7.15 → bear_utils-0.7.17}/AGENTS.md +0 -0
  13. {bear_utils-0.7.15 → bear_utils-0.7.17}/directory_structure.txt +0 -0
  14. {bear_utils-0.7.15 → bear_utils-0.7.17}/maskfile.md +0 -0
  15. {bear_utils-0.7.15 → bear_utils-0.7.17}/src/bear_utils/__init__.py +0 -0
  16. {bear_utils-0.7.15 → bear_utils-0.7.17}/src/bear_utils/ai/__init__.py +0 -0
  17. {bear_utils-0.7.15 → bear_utils-0.7.17}/src/bear_utils/ai/ai_helpers/__init__.py +0 -0
  18. {bear_utils-0.7.15 → bear_utils-0.7.17}/src/bear_utils/ai/ai_helpers/_common.py +0 -0
  19. {bear_utils-0.7.15 → bear_utils-0.7.17}/src/bear_utils/ai/ai_helpers/_config.py +0 -0
  20. {bear_utils-0.7.15 → bear_utils-0.7.17}/src/bear_utils/ai/ai_helpers/_parsers.py +0 -0
  21. {bear_utils-0.7.15 → bear_utils-0.7.17}/src/bear_utils/ai/ai_helpers/_types.py +0 -0
  22. {bear_utils-0.7.15 → bear_utils-0.7.17}/src/bear_utils/cache/__init__.py +0 -0
  23. {bear_utils-0.7.15 → bear_utils-0.7.17}/src/bear_utils/cli/__init__.py +0 -0
  24. {bear_utils-0.7.15 → bear_utils-0.7.17}/src/bear_utils/cli/commands.py +0 -0
  25. {bear_utils-0.7.15 → bear_utils-0.7.17}/src/bear_utils/cli/prompt_helpers.py +0 -0
  26. {bear_utils-0.7.15 → bear_utils-0.7.17}/src/bear_utils/cli/shell/__init__.py +0 -0
  27. {bear_utils-0.7.15 → bear_utils-0.7.17}/src/bear_utils/cli/shell/_base_command.py +0 -0
  28. {bear_utils-0.7.15 → bear_utils-0.7.17}/src/bear_utils/cli/shell/_common.py +0 -0
  29. {bear_utils-0.7.15 → bear_utils-0.7.17}/src/bear_utils/config/__init__.py +0 -0
  30. {bear_utils-0.7.15 → bear_utils-0.7.17}/src/bear_utils/config/config_manager.py +0 -0
  31. {bear_utils-0.7.15 → bear_utils-0.7.17}/src/bear_utils/config/dir_manager.py +0 -0
  32. {bear_utils-0.7.15 → bear_utils-0.7.17}/src/bear_utils/config/settings_manager.py +0 -0
  33. {bear_utils-0.7.15 → bear_utils-0.7.17}/src/bear_utils/constants/__init__.py +0 -0
  34. {bear_utils-0.7.15 → bear_utils-0.7.17}/src/bear_utils/constants/_exceptions.py +0 -0
  35. {bear_utils-0.7.15 → bear_utils-0.7.17}/src/bear_utils/constants/_lazy_typing.py +0 -0
  36. {bear_utils-0.7.15 → bear_utils-0.7.17}/src/bear_utils/constants/date_related.py +0 -0
  37. {bear_utils-0.7.15 → bear_utils-0.7.17}/src/bear_utils/constants/time_related.py +0 -0
  38. {bear_utils-0.7.15 → bear_utils-0.7.17}/src/bear_utils/database/__init__.py +0 -0
  39. {bear_utils-0.7.15 → bear_utils-0.7.17}/src/bear_utils/database/_db_manager.py +0 -0
  40. {bear_utils-0.7.15 → bear_utils-0.7.17}/src/bear_utils/events/__init__.py +0 -0
  41. {bear_utils-0.7.15 → bear_utils-0.7.17}/src/bear_utils/events/events_class.py +0 -0
  42. {bear_utils-0.7.15 → bear_utils-0.7.17}/src/bear_utils/events/events_module.py +0 -0
  43. {bear_utils-0.7.15 → bear_utils-0.7.17}/src/bear_utils/extras/__init__.py +0 -0
  44. {bear_utils-0.7.15 → bear_utils-0.7.17}/src/bear_utils/extras/_async_helpers.py +0 -0
  45. {bear_utils-0.7.15 → bear_utils-0.7.17}/src/bear_utils/extras/_tools.py +0 -0
  46. {bear_utils-0.7.15 → bear_utils-0.7.17}/src/bear_utils/extras/platform_utils.py +0 -0
  47. {bear_utils-0.7.15 → bear_utils-0.7.17}/src/bear_utils/extras/wrappers/__init__.py +0 -0
  48. {bear_utils-0.7.15 → bear_utils-0.7.17}/src/bear_utils/extras/wrappers/add_methods.py +0 -0
  49. {bear_utils-0.7.15 → bear_utils-0.7.17}/src/bear_utils/files/__init__.py +0 -0
  50. {bear_utils-0.7.15 → bear_utils-0.7.17}/src/bear_utils/files/file_handlers/__init__.py +0 -0
  51. {bear_utils-0.7.15 → bear_utils-0.7.17}/src/bear_utils/files/file_handlers/_base_file_handler.py +0 -0
  52. {bear_utils-0.7.15 → bear_utils-0.7.17}/src/bear_utils/files/file_handlers/json_file_handler.py +0 -0
  53. {bear_utils-0.7.15 → bear_utils-0.7.17}/src/bear_utils/files/file_handlers/log_file_handler.py +0 -0
  54. {bear_utils-0.7.15 → bear_utils-0.7.17}/src/bear_utils/files/file_handlers/txt_file_handler.py +0 -0
  55. {bear_utils-0.7.15 → bear_utils-0.7.17}/src/bear_utils/files/file_handlers/yaml_file_handler.py +0 -0
  56. {bear_utils-0.7.15 → bear_utils-0.7.17}/src/bear_utils/files/ignore_parser.py +0 -0
  57. {bear_utils-0.7.15 → bear_utils-0.7.17}/src/bear_utils/graphics/__init__.py +0 -0
  58. {bear_utils-0.7.15 → bear_utils-0.7.17}/src/bear_utils/graphics/bear_gradient.py +0 -0
  59. {bear_utils-0.7.15 → bear_utils-0.7.17}/src/bear_utils/graphics/image_helpers.py +0 -0
  60. {bear_utils-0.7.15 → bear_utils-0.7.17}/src/bear_utils/gui/__init__.py +0 -0
  61. {bear_utils-0.7.15 → bear_utils-0.7.17}/src/bear_utils/gui/gui_tools/__init__.py +0 -0
  62. {bear_utils-0.7.15 → bear_utils-0.7.17}/src/bear_utils/gui/gui_tools/_settings.py +0 -0
  63. {bear_utils-0.7.15 → bear_utils-0.7.17}/src/bear_utils/gui/gui_tools/_types.py +0 -0
  64. {bear_utils-0.7.15 → bear_utils-0.7.17}/src/bear_utils/gui/gui_tools/qt_app.py +0 -0
  65. {bear_utils-0.7.15 → bear_utils-0.7.17}/src/bear_utils/gui/gui_tools/qt_color_picker.py +0 -0
  66. {bear_utils-0.7.15 → bear_utils-0.7.17}/src/bear_utils/gui/gui_tools/qt_file_handler.py +0 -0
  67. {bear_utils-0.7.15 → bear_utils-0.7.17}/src/bear_utils/gui/gui_tools/qt_input_dialog.py +0 -0
  68. {bear_utils-0.7.15 → bear_utils-0.7.17}/src/bear_utils/logging/__init__.py +0 -0
  69. {bear_utils-0.7.15 → bear_utils-0.7.17}/src/bear_utils/logging/logger_manager/__init__.py +0 -0
  70. {bear_utils-0.7.15 → bear_utils-0.7.17}/src/bear_utils/logging/logger_manager/_common.py +0 -0
  71. {bear_utils-0.7.15 → bear_utils-0.7.17}/src/bear_utils/logging/logger_manager/_console_junk.py +0 -0
  72. {bear_utils-0.7.15 → bear_utils-0.7.17}/src/bear_utils/logging/logger_manager/_styles.py +0 -0
  73. {bear_utils-0.7.15 → bear_utils-0.7.17}/src/bear_utils/logging/logger_manager/loggers/__init__.py +0 -0
  74. {bear_utils-0.7.15 → bear_utils-0.7.17}/src/bear_utils/logging/logger_manager/loggers/_base_logger.py +0 -0
  75. {bear_utils-0.7.15 → bear_utils-0.7.17}/src/bear_utils/logging/logger_manager/loggers/_base_logger.pyi +0 -0
  76. {bear_utils-0.7.15 → bear_utils-0.7.17}/src/bear_utils/logging/logger_manager/loggers/_buffer_logger.py +0 -0
  77. {bear_utils-0.7.15 → bear_utils-0.7.17}/src/bear_utils/logging/logger_manager/loggers/_console_logger.py +0 -0
  78. {bear_utils-0.7.15 → bear_utils-0.7.17}/src/bear_utils/logging/logger_manager/loggers/_console_logger.pyi +0 -0
  79. {bear_utils-0.7.15 → bear_utils-0.7.17}/src/bear_utils/logging/logger_manager/loggers/_file_logger.py +0 -0
  80. {bear_utils-0.7.15 → bear_utils-0.7.17}/src/bear_utils/logging/logger_manager/loggers/_level_sin.py +0 -0
  81. {bear_utils-0.7.15 → bear_utils-0.7.17}/src/bear_utils/logging/logger_manager/loggers/_logger.py +0 -0
  82. {bear_utils-0.7.15 → bear_utils-0.7.17}/src/bear_utils/logging/logger_manager/loggers/_sub_logger.py +0 -0
  83. {bear_utils-0.7.15 → bear_utils-0.7.17}/src/bear_utils/logging/logger_manager/loggers/_sub_logger.pyi +0 -0
  84. {bear_utils-0.7.15 → bear_utils-0.7.17}/src/bear_utils/logging/loggers.py +0 -0
  85. {bear_utils-0.7.15 → bear_utils-0.7.17}/src/bear_utils/monitoring/__init__.py +0 -0
  86. {bear_utils-0.7.15 → bear_utils-0.7.17}/src/bear_utils/monitoring/host_monitor.py +0 -0
  87. {bear_utils-0.7.15 → bear_utils-0.7.17}/src/bear_utils/time/__init__.py +0 -0
  88. {bear_utils-0.7.15 → bear_utils-0.7.17}/tests/__init__.py +0 -0
  89. {bear_utils-0.7.15 → bear_utils-0.7.17}/tests/test_add_ord_suffix.py +0 -0
  90. {bear_utils-0.7.15 → bear_utils-0.7.17}/tests/test_clipboard.py +0 -0
  91. {bear_utils-0.7.15 → bear_utils-0.7.17}/tests/test_default_shell.py +0 -0
  92. {bear_utils-0.7.15 → bear_utils-0.7.17}/tests/test_gradient.py +0 -0
  93. {bear_utils-0.7.15 → bear_utils-0.7.17}/tests/test_logger.py +0 -0
  94. {bear_utils-0.7.15 → bear_utils-0.7.17}/tests/test_platform_utils.py +0 -0
@@ -1,5 +1,5 @@
1
1
  [bumpversion]
2
- current_version = 0.7.15
2
+ current_version = 0.7.17
3
3
 
4
4
  [bumpversion:file:pyproject.toml]
5
5
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: bear-utils
3
- Version: 0.7.15
3
+ Version: 0.7.17
4
4
  Summary: Various utilities for Bear programmers, including a rich logging utility, a disk cache, and a SQLite database wrapper amongst other things.
5
5
  Author-email: chaz <bright.lid5647@fastmail.com>
6
6
  Requires-Python: >=3.12
@@ -17,9 +17,10 @@ Requires-Dist: pyyaml>=6.0.2
17
17
  Requires-Dist: rich<15.0.0,>=14.0.0
18
18
  Requires-Dist: singleton-base>=1.0.5
19
19
  Requires-Dist: sqlalchemy<3.0.0,>=2.0.40
20
+ Requires-Dist: toml>=0.10.2
20
21
  Description-Content-Type: text/markdown
21
22
 
22
- # Bear Utils v# Bear Utils v0.7.15
23
+ # Bear Utils v# Bear Utils v0.7.17
23
24
 
24
25
  Personal set of tools and utilities for Python projects, focusing on modularity and ease of use. This library includes components for caching, database management, logging, time handling, file operations, CLI prompts, image processing, clipboard interaction, gradient utilities, event systems, and async helpers.
25
26
 
@@ -1,4 +1,4 @@
1
- # Bear Utils v# Bear Utils v0.7.15
1
+ # Bear Utils v# Bear Utils v0.7.17
2
2
 
3
3
  Personal set of tools and utilities for Python projects, focusing on modularity and ease of use. This library includes components for caching, database management, logging, time handling, file operations, CLI prompts, image processing, clipboard interaction, gradient utilities, event systems, and async helpers.
4
4
 
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "bear-utils"
3
- version = "0.7.15"
3
+ version = "0.7.17"
4
4
  description = "Various utilities for Bear programmers, including a rich logging utility, a disk cache, and a SQLite database wrapper amongst other things."
5
5
  authors = [{ name = "chaz", email = "bright.lid5647@fastmail.com" }]
6
6
  readme = "README.md"
@@ -19,6 +19,7 @@ dependencies = [
19
19
  "singleton-base>=1.0.5",
20
20
  "httpx>=0.28.1",
21
21
  "bear-epoch-time>=1.0.1",
22
+ "toml>=0.10.2",
22
23
  ]
23
24
 
24
25
  [build-system]
@@ -1,5 +1,6 @@
1
1
  import asyncio
2
2
  import os
3
+ import shlex
3
4
  import subprocess
4
5
  from asyncio.streams import StreamReader
5
6
  from asyncio.subprocess import Process
@@ -187,7 +188,7 @@ class SimpleShellSession:
187
188
  """Return the combined command as a string"""
188
189
  if not self.cmd_buffer:
189
190
  raise ValueError("No commands have been run yet")
190
- full_command: str = f'{self.shell} -c "{self.cmd_buffer.getvalue()}"'
191
+ full_command: str = f"{self.shell} -c {shlex.quote(self.cmd_buffer.getvalue())}"
191
192
  return full_command
192
193
 
193
194
  @property
@@ -46,6 +46,7 @@ class FileHandlerFactory:
46
46
  try:
47
47
  from .json_file_handler import JsonFileHandler
48
48
  from .log_file_handler import LogFileHandler
49
+ from .toml_file_handler import TomlFileHandler
49
50
  from .txt_file_handler import TextFileHandler
50
51
  from .yaml_file_handler import YamlFileHandler
51
52
 
@@ -53,6 +54,7 @@ class FileHandlerFactory:
53
54
  self.register_handler(TextFileHandler)
54
55
  self.register_handler(YamlFileHandler)
55
56
  self.register_handler(LogFileHandler)
57
+ self.register_handler(TomlFileHandler)
56
58
 
57
59
  except ImportError as e:
58
60
  warnings.warn(f"Could not import all default handlers: {e}")
@@ -0,0 +1,68 @@
1
+ from dataclasses import dataclass
2
+ from pathlib import Path
3
+ from typing import Any, ClassVar
4
+
5
+ import toml
6
+
7
+ from ._base_file_handler import FileHandler
8
+
9
+
10
+ class TomlFileHandler(FileHandler):
11
+ """Class for handling .toml files with read, write, and present methods"""
12
+
13
+ valid_extensions: ClassVar[list[str]] = ["toml"]
14
+
15
+ @FileHandler.ValidateFileType
16
+ def read_file(self, file_path: Path) -> dict:
17
+ try:
18
+ super().read_file(file_path)
19
+
20
+ return toml.load(file_path)
21
+ except Exception as e:
22
+ raise ValueError(f"Error reading file: {e}")
23
+
24
+ @FileHandler.ValidateFileType
25
+ def write_file(self, file_path: Path, data: dict[str, Any] | str, **kwargs) -> None:
26
+ try:
27
+ super().write_file(file_path, data)
28
+
29
+ with open(file_path, "w", encoding="utf-8") as file:
30
+ if isinstance(data, dict):
31
+ toml.dump(data, file, **kwargs)
32
+ else:
33
+ file.write(data)
34
+ except Exception as e:
35
+ raise ValueError(f"Error writing file: {e}")
36
+
37
+ def present_file(self, data: dict[str, Any] | str, **kwargs) -> str:
38
+ raise NotImplementedError("Presenting TOML files is not implemented. Not needed.")
39
+
40
+
41
+ @dataclass
42
+ class PyProjectToml:
43
+ """Dataclass for handling pyproject.toml files"""
44
+
45
+ name: str
46
+ version: str
47
+ description: str | None = None
48
+ author_name: str | None = None
49
+ author_email: str | None = None
50
+ dependencies: list[str] | None = None
51
+
52
+ def __post_init__(self):
53
+ if self.dependencies:
54
+ self.dependencies = [dep.split(" ")[0] for dep in self.dependencies if isinstance(dep, str)]
55
+ self.dependencies = [dep.split(">=")[0] for dep in self.dependencies]
56
+
57
+ @classmethod
58
+ def from_dict(cls, data: dict[str, Any]) -> "PyProjectToml":
59
+ data = data.get("project", {})
60
+ authors: dict = data.get("authors", {})[0]
61
+ return cls(
62
+ name=data.get("name", ""),
63
+ version=data.get("version", ""),
64
+ description=data.get("description"),
65
+ author_name=authors.get("name") if authors else None,
66
+ author_email=authors.get("email") if authors else None,
67
+ dependencies=data.get("dependencies", []),
68
+ )
@@ -27,7 +27,7 @@ wheels = [
27
27
 
28
28
  [[package]]
29
29
  name = "bear-epoch-time"
30
- version = "1.0.1"
30
+ version = "1.0.4"
31
31
  source = { registry = "https://pypi.org/simple/" }
32
32
  dependencies = [
33
33
  { name = "python-dateutil" },
@@ -36,14 +36,14 @@ dependencies = [
36
36
  { name = "rich-tree-cli" },
37
37
  { name = "tzlocal" },
38
38
  ]
39
- sdist = { url = "https://files.pythonhosted.org/packages/02/a1/d1e4913c680693166759a872bd3d40465f8270b7a139b044ce91b9f26922/bear_epoch_time-1.0.1.tar.gz", hash = "sha256:e6d389f04915d85881d8bb7466dabfc843cf6f430d2d05c9b90ec9febdf72bf7", size = 38555, upload_time = "2025-06-16T05:16:38.789Z" }
39
+ sdist = { url = "https://files.pythonhosted.org/packages/6d/b4/8b658c78658687b048628784b9e86cce619903a29ccdfbc66303aebf48e9/bear_epoch_time-1.0.4.tar.gz", hash = "sha256:a1d6bebb4a24c53ecfe4a430670b2835a5c54fff73bb5541d5fbd5ffe136b886", size = 38719, upload_time = "2025-06-19T20:48:52.051Z" }
40
40
  wheels = [
41
- { url = "https://files.pythonhosted.org/packages/b2/01/99cd4a95b78366648f7b5f4400123469630e9c635a88ec353e707060dde4/bear_epoch_time-1.0.1-py3-none-any.whl", hash = "sha256:d7f560c976a65c4f5b2bed509b8494c1189256fd4b992a5a5ad31f88993c82aa", size = 16275, upload_time = "2025-06-16T05:16:37.839Z" },
41
+ { url = "https://files.pythonhosted.org/packages/92/38/d5c375fbfe5410d151baa614cc01c75f7cfc4043e31a9d0b2f6b0f224833/bear_epoch_time-1.0.4-py3-none-any.whl", hash = "sha256:1f7b6acc02967128725a9ca325a2233b4086ce2a0efdb0711bb985fed6360b7a", size = 14136, upload_time = "2025-06-19T20:48:50.819Z" },
42
42
  ]
43
43
 
44
44
  [[package]]
45
45
  name = "bear-utils"
46
- version = "0.7.11"
46
+ version = "0.7.15"
47
47
  source = { editable = "." }
48
48
  dependencies = [
49
49
  { name = "bear-epoch-time" },
@@ -59,6 +59,7 @@ dependencies = [
59
59
  { name = "rich" },
60
60
  { name = "singleton-base" },
61
61
  { name = "sqlalchemy" },
62
+ { name = "toml" },
62
63
  ]
63
64
 
64
65
  [package.dev-dependencies]
@@ -84,6 +85,7 @@ requires-dist = [
84
85
  { name = "rich", specifier = ">=14.0.0,<15.0.0" },
85
86
  { name = "singleton-base", specifier = ">=1.0.5" },
86
87
  { name = "sqlalchemy", specifier = ">=2.0.40,<3.0.0" },
88
+ { name = "toml", specifier = ">=0.10.2" },
87
89
  ]
88
90
 
89
91
  [package.metadata.requires-dev]
@@ -963,6 +965,15 @@ wheels = [
963
965
  { url = "https://files.pythonhosted.org/packages/1c/fc/9ba22f01b5cdacc8f5ed0d22304718d2c758fce3fd49a5372b886a86f37c/sqlalchemy-2.0.41-py3-none-any.whl", hash = "sha256:57df5dc6fdb5ed1a88a1ed2195fd31927e705cad62dedd86b46972752a80f576", size = 1911224, upload_time = "2025-05-14T17:39:42.154Z" },
964
966
  ]
965
967
 
968
+ [[package]]
969
+ name = "toml"
970
+ version = "0.10.2"
971
+ source = { registry = "https://pypi.org/simple/" }
972
+ sdist = { url = "https://files.pythonhosted.org/packages/be/ba/1f744cdc819428fc6b5084ec34d9b30660f6f9daaf70eead706e3203ec3c/toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f", size = 22253, upload_time = "2020-11-01T01:40:22.204Z" }
973
+ wheels = [
974
+ { url = "https://files.pythonhosted.org/packages/44/6f/7120676b6d73228c96e17f1f794d8ab046fc910d781c8d151120c3f1569e/toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b", size = 16588, upload_time = "2020-11-01T01:40:20.672Z" },
975
+ ]
976
+
966
977
  [[package]]
967
978
  name = "tomli-w"
968
979
  version = "1.2.0"
bear_utils-0.7.15/test.py DELETED
@@ -1,24 +0,0 @@
1
- from bear_utils.extras._tools import copy_to_clipboard_async
2
-
3
-
4
- async def copy(output: str) -> int:
5
- """
6
- Asynchronously copy the output to the clipboard.
7
-
8
- Args:
9
- output (str): The output to copy to the clipboard.
10
-
11
- Returns:
12
- int: The return code of the command.
13
- """
14
- return await copy_to_clipboard_async(output)
15
-
16
-
17
- if __name__ == "__main__":
18
- import asyncio
19
-
20
- async def main():
21
- result = await copy("Hello, World!")
22
- print(f"Copy result: {result}")
23
-
24
- asyncio.run(main())
File without changes
File without changes
File without changes
File without changes