dulus 0.2.4__tar.gz → 0.2.6__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 (156) hide show
  1. {dulus-0.2.4/dulus.egg-info → dulus-0.2.6}/PKG-INFO +1 -1
  2. {dulus-0.2.4 → dulus-0.2.6/dulus.egg-info}/PKG-INFO +1 -1
  3. {dulus-0.2.4 → dulus-0.2.6}/dulus.py +11 -9
  4. {dulus-0.2.4 → dulus-0.2.6}/providers.py +14 -6
  5. {dulus-0.2.4 → dulus-0.2.6}/pyproject.toml +1 -1
  6. {dulus-0.2.4 → dulus-0.2.6}/tools.py +1 -2
  7. {dulus-0.2.4 → dulus-0.2.6}/LICENSE +0 -0
  8. {dulus-0.2.4 → dulus-0.2.6}/MANIFEST.in +0 -0
  9. {dulus-0.2.4 → dulus-0.2.6}/README.md +0 -0
  10. {dulus-0.2.4 → dulus-0.2.6}/agent.py +0 -0
  11. {dulus-0.2.4 → dulus-0.2.6}/backend/__init__.py +0 -0
  12. {dulus-0.2.4 → dulus-0.2.6}/backend/compressor.py +0 -0
  13. {dulus-0.2.4 → dulus-0.2.6}/backend/context.py +0 -0
  14. {dulus-0.2.4 → dulus-0.2.6}/backend/githook.py +0 -0
  15. {dulus-0.2.4 → dulus-0.2.6}/backend/marketplace.py +0 -0
  16. {dulus-0.2.4 → dulus-0.2.6}/backend/mempalace_bridge.py +0 -0
  17. {dulus-0.2.4 → dulus-0.2.6}/backend/personas.py +0 -0
  18. {dulus-0.2.4 → dulus-0.2.6}/backend/plugins.py +0 -0
  19. {dulus-0.2.4 → dulus-0.2.6}/backend/server.py +0 -0
  20. {dulus-0.2.4 → dulus-0.2.6}/backend/tasks.py +0 -0
  21. {dulus-0.2.4 → dulus-0.2.6}/batch_api.py +0 -0
  22. {dulus-0.2.4 → dulus-0.2.6}/checkpoint/__init__.py +0 -0
  23. {dulus-0.2.4 → dulus-0.2.6}/checkpoint/hooks.py +0 -0
  24. {dulus-0.2.4 → dulus-0.2.6}/checkpoint/store.py +0 -0
  25. {dulus-0.2.4 → dulus-0.2.6}/checkpoint/types.py +0 -0
  26. {dulus-0.2.4 → dulus-0.2.6}/claude_code_watcher.py +0 -0
  27. {dulus-0.2.4 → dulus-0.2.6}/clipboard_utils.py +0 -0
  28. {dulus-0.2.4 → dulus-0.2.6}/cloudsave.py +0 -0
  29. {dulus-0.2.4 → dulus-0.2.6}/common.py +0 -0
  30. {dulus-0.2.4 → dulus-0.2.6}/compaction.py +0 -0
  31. {dulus-0.2.4 → dulus-0.2.6}/config.py +0 -0
  32. {dulus-0.2.4 → dulus-0.2.6}/context.py +0 -0
  33. {dulus-0.2.4 → dulus-0.2.6}/data/__init__.py +0 -0
  34. {dulus-0.2.4 → dulus-0.2.6}/data/active_persona.json +0 -0
  35. {dulus-0.2.4 → dulus-0.2.6}/data/context.json +0 -0
  36. {dulus-0.2.4 → dulus-0.2.6}/data/marketplace.json +0 -0
  37. {dulus-0.2.4 → dulus-0.2.6}/data/personas.json +0 -0
  38. {dulus-0.2.4 → dulus-0.2.6}/data/tasks.json +0 -0
  39. {dulus-0.2.4 → dulus-0.2.6}/docs/README.md +0 -0
  40. {dulus-0.2.4 → dulus-0.2.6}/docs/__init__.py +0 -0
  41. {dulus-0.2.4 → dulus-0.2.6}/docs/api.html +0 -0
  42. {dulus-0.2.4 → dulus-0.2.6}/docs/architecture.md +0 -0
  43. {dulus-0.2.4 → dulus-0.2.6}/docs/azure-speech-template.json +0 -0
  44. {dulus-0.2.4 → dulus-0.2.6}/docs/dashboard/index.html +0 -0
  45. {dulus-0.2.4 → dulus-0.2.6}/docs/divider.svg +0 -0
  46. {dulus-0.2.4 → dulus-0.2.6}/docs/generate.py +0 -0
  47. {dulus-0.2.4 → dulus-0.2.6}/docs/hero.svg +0 -0
  48. {dulus-0.2.4 → dulus-0.2.6}/docs/index.html +0 -0
  49. {dulus-0.2.4 → dulus-0.2.6}/docs/news.md +0 -0
  50. {dulus-0.2.4 → dulus-0.2.6}/docs/nvidia-models.svg +0 -0
  51. {dulus-0.2.4 → dulus-0.2.6}/docs/particle-playground.html +0 -0
  52. {dulus-0.2.4 → dulus-0.2.6}/docs/personas/index.html +0 -0
  53. {dulus-0.2.4 → dulus-0.2.6}/docs/preview.html +0 -0
  54. {dulus-0.2.4 → dulus-0.2.6}/docs/sec-agents.svg +0 -0
  55. {dulus-0.2.4 → dulus-0.2.6}/docs/sec-brainstorm.svg +0 -0
  56. {dulus-0.2.4 → dulus-0.2.6}/docs/sec-bridges.svg +0 -0
  57. {dulus-0.2.4 → dulus-0.2.6}/docs/sec-features.svg +0 -0
  58. {dulus-0.2.4 → dulus-0.2.6}/docs/sec-freetier.svg +0 -0
  59. {dulus-0.2.4 → dulus-0.2.6}/docs/sec-memory.svg +0 -0
  60. {dulus-0.2.4 → dulus-0.2.6}/docs/sec-models.svg +0 -0
  61. {dulus-0.2.4 → dulus-0.2.6}/docs/sec-perms.svg +0 -0
  62. {dulus-0.2.4 → dulus-0.2.6}/docs/sec-plugins.svg +0 -0
  63. {dulus-0.2.4 → dulus-0.2.6}/docs/sec-quickstart.svg +0 -0
  64. {dulus-0.2.4 → dulus-0.2.6}/docs/sec-ssj.svg +0 -0
  65. {dulus-0.2.4 → dulus-0.2.6}/docs/spinners.svg +0 -0
  66. {dulus-0.2.4 → dulus-0.2.6}/docs/split-pane.svg +0 -0
  67. {dulus-0.2.4 → dulus-0.2.6}/docs/terminal-boot.svg +0 -0
  68. {dulus-0.2.4 → dulus-0.2.6}/docs/uploads/particle-playground.html +0 -0
  69. {dulus-0.2.4 → dulus-0.2.6}/dulus.egg-info/SOURCES.txt +0 -0
  70. {dulus-0.2.4 → dulus-0.2.6}/dulus.egg-info/dependency_links.txt +0 -0
  71. {dulus-0.2.4 → dulus-0.2.6}/dulus.egg-info/entry_points.txt +0 -0
  72. {dulus-0.2.4 → dulus-0.2.6}/dulus.egg-info/requires.txt +0 -0
  73. {dulus-0.2.4 → dulus-0.2.6}/dulus.egg-info/top_level.txt +0 -0
  74. {dulus-0.2.4 → dulus-0.2.6}/dulus_gui.py +0 -0
  75. {dulus-0.2.4 → dulus-0.2.6}/dulus_mcp/__init__.py +0 -0
  76. {dulus-0.2.4 → dulus-0.2.6}/dulus_mcp/client.py +0 -0
  77. {dulus-0.2.4 → dulus-0.2.6}/dulus_mcp/config.py +0 -0
  78. {dulus-0.2.4 → dulus-0.2.6}/dulus_mcp/tools.py +0 -0
  79. {dulus-0.2.4 → dulus-0.2.6}/dulus_mcp/types.py +0 -0
  80. {dulus-0.2.4 → dulus-0.2.6}/gui/__init__.py +0 -0
  81. {dulus-0.2.4 → dulus-0.2.6}/gui/agent_bridge.py +0 -0
  82. {dulus-0.2.4 → dulus-0.2.6}/gui/chat_widget.py +0 -0
  83. {dulus-0.2.4 → dulus-0.2.6}/gui/main_window.py +0 -0
  84. {dulus-0.2.4 → dulus-0.2.6}/gui/personas.py +0 -0
  85. {dulus-0.2.4 → dulus-0.2.6}/gui/session_utils.py +0 -0
  86. {dulus-0.2.4 → dulus-0.2.6}/gui/settings_dialog.py +0 -0
  87. {dulus-0.2.4 → dulus-0.2.6}/gui/sidebar.py +0 -0
  88. {dulus-0.2.4 → dulus-0.2.6}/gui/tasks_view.py +0 -0
  89. {dulus-0.2.4 → dulus-0.2.6}/gui/themes.py +0 -0
  90. {dulus-0.2.4 → dulus-0.2.6}/gui/tool_panel.py +0 -0
  91. {dulus-0.2.4 → dulus-0.2.6}/input.py +0 -0
  92. {dulus-0.2.4 → dulus-0.2.6}/license_manager.py +0 -0
  93. {dulus-0.2.4 → dulus-0.2.6}/memory/__init__.py +0 -0
  94. {dulus-0.2.4 → dulus-0.2.6}/memory/audit.py +0 -0
  95. {dulus-0.2.4 → dulus-0.2.6}/memory/consolidator.py +0 -0
  96. {dulus-0.2.4 → dulus-0.2.6}/memory/context.py +0 -0
  97. {dulus-0.2.4 → dulus-0.2.6}/memory/offload.py +0 -0
  98. {dulus-0.2.4 → dulus-0.2.6}/memory/palace.py +0 -0
  99. {dulus-0.2.4 → dulus-0.2.6}/memory/scan.py +0 -0
  100. {dulus-0.2.4 → dulus-0.2.6}/memory/sessions.py +0 -0
  101. {dulus-0.2.4 → dulus-0.2.6}/memory/store.py +0 -0
  102. {dulus-0.2.4 → dulus-0.2.6}/memory/tools.py +0 -0
  103. {dulus-0.2.4 → dulus-0.2.6}/memory/types.py +0 -0
  104. {dulus-0.2.4 → dulus-0.2.6}/memory/vector_search.py +0 -0
  105. {dulus-0.2.4 → dulus-0.2.6}/multi_agent/__init__.py +0 -0
  106. {dulus-0.2.4 → dulus-0.2.6}/multi_agent/subagent.py +0 -0
  107. {dulus-0.2.4 → dulus-0.2.6}/multi_agent/tools.py +0 -0
  108. {dulus-0.2.4 → dulus-0.2.6}/offload_helper.py +0 -0
  109. {dulus-0.2.4 → dulus-0.2.6}/plugin/__init__.py +0 -0
  110. {dulus-0.2.4 → dulus-0.2.6}/plugin/autoadapter.py +0 -0
  111. {dulus-0.2.4 → dulus-0.2.6}/plugin/loader.py +0 -0
  112. {dulus-0.2.4 → dulus-0.2.6}/plugin/recommend.py +0 -0
  113. {dulus-0.2.4 → dulus-0.2.6}/plugin/store.py +0 -0
  114. {dulus-0.2.4 → dulus-0.2.6}/plugin/types.py +0 -0
  115. {dulus-0.2.4 → dulus-0.2.6}/setup.cfg +0 -0
  116. {dulus-0.2.4 → dulus-0.2.6}/skill/__init__.py +0 -0
  117. {dulus-0.2.4 → dulus-0.2.6}/skill/builtin.py +0 -0
  118. {dulus-0.2.4 → dulus-0.2.6}/skill/clawhub.py +0 -0
  119. {dulus-0.2.4 → dulus-0.2.6}/skill/executor.py +0 -0
  120. {dulus-0.2.4 → dulus-0.2.6}/skill/loader.py +0 -0
  121. {dulus-0.2.4 → dulus-0.2.6}/skill/tools.py +0 -0
  122. {dulus-0.2.4 → dulus-0.2.6}/skills.py +0 -0
  123. {dulus-0.2.4 → dulus-0.2.6}/spinner.py +0 -0
  124. {dulus-0.2.4 → dulus-0.2.6}/string_utils.py +0 -0
  125. {dulus-0.2.4 → dulus-0.2.6}/subagent.py +0 -0
  126. {dulus-0.2.4 → dulus-0.2.6}/task/__init__.py +0 -0
  127. {dulus-0.2.4 → dulus-0.2.6}/task/store.py +0 -0
  128. {dulus-0.2.4 → dulus-0.2.6}/task/tools.py +0 -0
  129. {dulus-0.2.4 → dulus-0.2.6}/task/types.py +0 -0
  130. {dulus-0.2.4 → dulus-0.2.6}/tests/test_checkpoint.py +0 -0
  131. {dulus-0.2.4 → dulus-0.2.6}/tests/test_compaction.py +0 -0
  132. {dulus-0.2.4 → dulus-0.2.6}/tests/test_diff_view.py +0 -0
  133. {dulus-0.2.4 → dulus-0.2.6}/tests/test_injection_fix.py +0 -0
  134. {dulus-0.2.4 → dulus-0.2.6}/tests/test_license.py +0 -0
  135. {dulus-0.2.4 → dulus-0.2.6}/tests/test_mcp.py +0 -0
  136. {dulus-0.2.4 → dulus-0.2.6}/tests/test_memory.py +0 -0
  137. {dulus-0.2.4 → dulus-0.2.6}/tests/test_plugin.py +0 -0
  138. {dulus-0.2.4 → dulus-0.2.6}/tests/test_skills.py +0 -0
  139. {dulus-0.2.4 → dulus-0.2.6}/tests/test_subagent.py +0 -0
  140. {dulus-0.2.4 → dulus-0.2.6}/tests/test_task.py +0 -0
  141. {dulus-0.2.4 → dulus-0.2.6}/tests/test_telegram_buffer.py +0 -0
  142. {dulus-0.2.4 → dulus-0.2.6}/tests/test_tool_registry.py +0 -0
  143. {dulus-0.2.4 → dulus-0.2.6}/tests/test_voice.py +0 -0
  144. {dulus-0.2.4 → dulus-0.2.6}/tmux_offloader.py +0 -0
  145. {dulus-0.2.4 → dulus-0.2.6}/tmux_tools.py +0 -0
  146. {dulus-0.2.4 → dulus-0.2.6}/tool_registry.py +0 -0
  147. {dulus-0.2.4 → dulus-0.2.6}/ui/__init__.py +0 -0
  148. {dulus-0.2.4 → dulus-0.2.6}/ui/input.py +0 -0
  149. {dulus-0.2.4 → dulus-0.2.6}/ui/render.py +0 -0
  150. {dulus-0.2.4 → dulus-0.2.6}/voice/__init__.py +0 -0
  151. {dulus-0.2.4 → dulus-0.2.6}/voice/keyterms.py +0 -0
  152. {dulus-0.2.4 → dulus-0.2.6}/voice/recorder.py +0 -0
  153. {dulus-0.2.4 → dulus-0.2.6}/voice/stt.py +0 -0
  154. {dulus-0.2.4 → dulus-0.2.6}/voice/tts.py +0 -0
  155. {dulus-0.2.4 → dulus-0.2.6}/webchat.py +0 -0
  156. {dulus-0.2.4 → dulus-0.2.6}/webchat_server.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dulus
3
- Version: 0.2.4
3
+ Version: 0.2.6
4
4
  Summary: Spanish-first multi-provider AI CLI — 14 NVIDIA models free, Mesa Redonda, voice, TTS, RTK token reducer, MemPalace
5
5
  Author: KevRojo
6
6
  License: MIT
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dulus
3
- Version: 0.2.4
3
+ Version: 0.2.6
4
4
  Summary: Spanish-first multi-provider AI CLI — 14 NVIDIA models free, Mesa Redonda, voice, TTS, RTK token reducer, MemPalace
5
5
  Author: KevRojo
6
6
  License: MIT
@@ -99,7 +99,8 @@ Slash commands in REPL:
99
99
  /kill_tmux Kill all stuck tmux/psmux sessions (cleanup)
100
100
  /batch Manage Kimi Batch tasks (list, status, fetch)
101
101
  /roundtable Start a multi-model roundtable discussion
102
- /harvest Harvest Claude.ai cookies
102
+ /harvest Harvest Claude.ai cookies (alias: /harvest-claude)
103
+ /harvest-claude Harvest Claude.ai cookies
103
104
  /harvest-kimi Harvest Kimi.com (Consumer) session/gRPC tokens
104
105
  /harvest-gemini Harvest Gemini (Consumer) session tokens
105
106
  /harvest-qwen Harvest Qwen (chat.qwen.ai) session tokens
@@ -2995,7 +2996,7 @@ def cmd_sticky_input(_args: str, _state, config) -> bool:
2995
2996
  Background notifications land where they land.
2996
2997
  """
2997
2998
  from config import save_config
2998
- config["sticky_input"] = not config.get("sticky_input", False)
2999
+ config["sticky_input"] = not config.get("sticky_input", True)
2999
3000
  state_str = "ON" if config["sticky_input"] else "OFF"
3000
3001
  ok(f"Sticky input bar: {state_str} (restart Dulus to take effect)")
3001
3002
  save_config(config)
@@ -6372,6 +6373,8 @@ COMMANDS = {
6372
6373
  "history": cmd_history,
6373
6374
  "mem_palace": cmd_mem_palace,
6374
6375
  "harvest": cmd_harvest,
6376
+ "harvest-claude": cmd_harvest,
6377
+ "claude-harvest": cmd_harvest,
6375
6378
  "harvest-kimi": cmd_harvest_kimi,
6376
6379
  "harvest-gemini": cmd_harvest_gemini,
6377
6380
  "gemini-harvest": cmd_harvest_gemini,
@@ -6526,6 +6529,7 @@ _CMD_META: dict[str, tuple[str, list[str]]] = {
6526
6529
  "claude_chats": ("List Claude.ai conversations", ["all"]),
6527
6530
  "gemini_chats": ("Manage Gemini Web conversations", ["new"]),
6528
6531
  "gemini_harvest": ("Harvest Gemini Web cookies (alias)", []),
6532
+ "harvest-claude": ("Harvest Claude.ai cookies (alias)", []),
6529
6533
  "webchat": ("Spawn web chat UI", ["stop"]),
6530
6534
  "gui": ("Launch desktop GUI", []),
6531
6535
  }
@@ -7434,13 +7438,11 @@ def repl(config: dict, initial_prompt: str = None):
7434
7438
  sys.stdout.write("\x1b[?2004h") # enable bracketed paste mode
7435
7439
  sys.stdout.flush()
7436
7440
 
7437
- # ── Sticky input bar (opt-in) ─────────────────────────────────────────────
7438
- # prompt_toolkit can anchor the input line so background prints flow above
7439
- # it, but on Windows consoles it constantly redraws on every keystroke and
7440
- # that causes visible jitter / artifacts. Disabled by default the user
7441
- # can turn it on with `/sticky_input on` (or set `sticky_input: true` in
7442
- # config) if they want the anchored behavior.
7443
- _sticky_input_enabled = bool(config.get("sticky_input", False))
7441
+ # ── Sticky input bar (ON by default) ─────────────────────────────────────
7442
+ # prompt_toolkit anchors the input line so background prints flow above it.
7443
+ # On Windows consoles it can redraw on every keystroke (mild jitter), but
7444
+ # the UX win outweighs it. Toggle off with `/sticky_input` if needed.
7445
+ _sticky_input_enabled = bool(config.get("sticky_input", True))
7444
7446
  try:
7445
7447
  import common as _cm
7446
7448
  _cm.apply_theme(config.get("theme", "dulus"))
@@ -1065,8 +1065,12 @@ def stream_claude_code(
1065
1065
  import subprocess as _sp
1066
1066
  from pathlib import Path as _Path
1067
1067
 
1068
- _cwd_slug = str(_Path.cwd()).replace(":", "-").replace("\\", "-").replace("/", "-")
1069
- _session_dir = _Path.home() / ".claude" / "projects" / _cwd_slug
1068
+ _project_override = config.get("claude_code_project_dir", "").strip()
1069
+ if _project_override:
1070
+ _slug = _project_override.replace(":", "-").replace("\\", "-").replace("/", "-")
1071
+ else:
1072
+ _slug = str(_Path.cwd()).replace(":", "-").replace("\\", "-").replace("/", "-")
1073
+ _session_dir = _Path.home() / ".claude" / "projects" / _slug
1070
1074
  _jsonl_files = sorted(_session_dir.glob("*.jsonl"), key=lambda f: f.stat().st_mtime, reverse=True)
1071
1075
  _jsonl_path = _jsonl_files[0] if _jsonl_files else None
1072
1076
 
@@ -1180,16 +1184,20 @@ def stream_claude_code(
1180
1184
  # If we have text and silence window passed — flush
1181
1185
  if _accumulated and (_time.time() - _last_new_entry_time) >= _silence:
1182
1186
  text = "\n\n".join(_accumulated)
1183
- yield TextChunk(text)
1184
- yield AssistantTurn(text, [], 0, 0)
1187
+ _parser = WebToolParser(auto_wrap_json=True)
1188
+ _display = _parser.parse_chunk(text) + _parser.flush()
1189
+ yield TextChunk(_display)
1190
+ yield AssistantTurn(_display, _parser.tool_calls, 0, 0)
1185
1191
  return
1186
1192
 
1187
1193
  _time.sleep(_poll)
1188
1194
 
1189
1195
  if _accumulated:
1190
1196
  text = "\n\n".join(_accumulated)
1191
- yield TextChunk(text)
1192
- yield AssistantTurn(text, [], 0, 0)
1197
+ _parser = WebToolParser(auto_wrap_json=True)
1198
+ _display = _parser.parse_chunk(text) + _parser.flush()
1199
+ yield TextChunk(_display)
1200
+ yield AssistantTurn(_display, _parser.tool_calls, 0, 0)
1193
1201
  return
1194
1202
 
1195
1203
  msg = "[claude-code] Timeout waiting for assistant response (90s)."
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "dulus"
7
- version = "0.2.4"
7
+ version = "0.2.6"
8
8
  description = "Spanish-first multi-provider AI CLI — 14 NVIDIA models free, Mesa Redonda, voice, TTS, RTK token reducer, MemPalace"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"
@@ -896,8 +896,7 @@ def _rtk_binary() -> Optional[str]:
896
896
  here = Path(__file__).resolve().parent
897
897
  name = "rtk.exe" if _sys.platform == "win32" else "rtk"
898
898
  candidates = [here / "rtk" / name]
899
- if _sys.platform != "win32":
900
- candidates.append(Path.home() / ".local" / "bin" / "rtk")
899
+ candidates.append(Path.home() / ".local" / "bin" / name)
901
900
 
902
901
  for c in candidates:
903
902
  if c.exists() and c.is_file():
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
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