drydock-cli 3.0.120__tar.gz → 3.0.122__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.
- {drydock_cli-3.0.120/drydock_cli.egg-info → drydock_cli-3.0.122}/PKG-INFO +1 -1
- {drydock_cli-3.0.120 → drydock_cli-3.0.122}/drydock/recipes.py +2 -0
- {drydock_cli-3.0.120 → drydock_cli-3.0.122}/drydock/tools/__init__.py +4 -0
- {drydock_cli-3.0.120 → drydock_cli-3.0.122}/drydock/tui/app.py +12 -1
- {drydock_cli-3.0.120 → drydock_cli-3.0.122/drydock_cli.egg-info}/PKG-INFO +1 -1
- {drydock_cli-3.0.120 → drydock_cli-3.0.122}/pyproject.toml +1 -1
- {drydock_cli-3.0.120 → drydock_cli-3.0.122}/tests/test_recipes.py +7 -0
- {drydock_cli-3.0.120 → drydock_cli-3.0.122}/tests/test_screenshot.py +13 -0
- {drydock_cli-3.0.120 → drydock_cli-3.0.122}/tests/test_skills.py +5 -1
- {drydock_cli-3.0.120 → drydock_cli-3.0.122}/tests/test_suggest.py +10 -0
- {drydock_cli-3.0.120 → drydock_cli-3.0.122}/LICENSE +0 -0
- {drydock_cli-3.0.120 → drydock_cli-3.0.122}/NOTICE +0 -0
- {drydock_cli-3.0.120 → drydock_cli-3.0.122}/README.md +0 -0
- {drydock_cli-3.0.120 → drydock_cli-3.0.122}/drydock/__init__.py +0 -0
- {drydock_cli-3.0.120 → drydock_cli-3.0.122}/drydock/__main__.py +0 -0
- {drydock_cli-3.0.120 → drydock_cli-3.0.122}/drydock/advisor.py +0 -0
- {drydock_cli-3.0.120 → drydock_cli-3.0.122}/drydock/agent.py +0 -0
- {drydock_cli-3.0.120 → drydock_cli-3.0.122}/drydock/bash_safety.py +0 -0
- {drydock_cli-3.0.120 → drydock_cli-3.0.122}/drydock/builtin_skills/__init__.py +0 -0
- {drydock_cli-3.0.120 → drydock_cli-3.0.122}/drydock/builtin_skills/ml-data.md +0 -0
- {drydock_cli-3.0.120 → drydock_cli-3.0.122}/drydock/builtin_skills/ml-debug.md +0 -0
- {drydock_cli-3.0.120 → drydock_cli-3.0.122}/drydock/builtin_skills/ml-finetune.md +0 -0
- {drydock_cli-3.0.120 → drydock_cli-3.0.122}/drydock/builtin_skills/ml-metrics.md +0 -0
- {drydock_cli-3.0.120 → drydock_cli-3.0.122}/drydock/builtin_skills/ml-rl.md +0 -0
- {drydock_cli-3.0.120 → drydock_cli-3.0.122}/drydock/builtin_skills/ml-train.md +0 -0
- {drydock_cli-3.0.120 → drydock_cli-3.0.122}/drydock/builtin_skills/rmf-categorize.md +0 -0
- {drydock_cli-3.0.120 → drydock_cli-3.0.122}/drydock/builtin_skills/rmf-control.md +0 -0
- {drydock_cli-3.0.120 → drydock_cli-3.0.122}/drydock/builtin_skills/rmf-poam.md +0 -0
- {drydock_cli-3.0.120 → drydock_cli-3.0.122}/drydock/builtin_skills/rmf-review.md +0 -0
- {drydock_cli-3.0.120 → drydock_cli-3.0.122}/drydock/builtin_skills/stig-assess.md +0 -0
- {drydock_cli-3.0.120 → drydock_cli-3.0.122}/drydock/builtin_skills/stig-remediate.md +0 -0
- {drydock_cli-3.0.120 → drydock_cli-3.0.122}/drydock/cci.py +0 -0
- {drydock_cli-3.0.120 → drydock_cli-3.0.122}/drydock/cli.py +0 -0
- {drydock_cli-3.0.120 → drydock_cli-3.0.122}/drydock/compaction.py +0 -0
- {drydock_cli-3.0.120 → drydock_cli-3.0.122}/drydock/config.py +0 -0
- {drydock_cli-3.0.120 → drydock_cli-3.0.122}/drydock/detect.py +0 -0
- {drydock_cli-3.0.120 → drydock_cli-3.0.122}/drydock/extract.py +0 -0
- {drydock_cli-3.0.120 → drydock_cli-3.0.122}/drydock/gittools.py +0 -0
- {drydock_cli-3.0.120 → drydock_cli-3.0.122}/drydock/graphrag.py +0 -0
- {drydock_cli-3.0.120 → drydock_cli-3.0.122}/drydock/guards.py +0 -0
- {drydock_cli-3.0.120 → drydock_cli-3.0.122}/drydock/loop_detect.py +0 -0
- {drydock_cli-3.0.120 → drydock_cli-3.0.122}/drydock/mcp.py +0 -0
- {drydock_cli-3.0.120 → drydock_cli-3.0.122}/drydock/poam.py +0 -0
- {drydock_cli-3.0.120 → drydock_cli-3.0.122}/drydock/providers.py +0 -0
- {drydock_cli-3.0.120 → drydock_cli-3.0.122}/drydock/rmf.py +0 -0
- {drydock_cli-3.0.120 → drydock_cli-3.0.122}/drydock/rmf_graph.py +0 -0
- {drydock_cli-3.0.120 → drydock_cli-3.0.122}/drydock/skills.py +0 -0
- {drydock_cli-3.0.120 → drydock_cli-3.0.122}/drydock/stig.py +0 -0
- {drydock_cli-3.0.120 → drydock_cli-3.0.122}/drydock/suggest.py +0 -0
- {drydock_cli-3.0.120 → drydock_cli-3.0.122}/drydock/tool_registry.py +0 -0
- {drydock_cli-3.0.120 → drydock_cli-3.0.122}/drydock/tui/__init__.py +0 -0
- {drydock_cli-3.0.120 → drydock_cli-3.0.122}/drydock/tui/approval.py +0 -0
- {drydock_cli-3.0.120 → drydock_cli-3.0.122}/drydock/tui/messages.py +0 -0
- {drydock_cli-3.0.120 → drydock_cli-3.0.122}/drydock/tui/widgets.py +0 -0
- {drydock_cli-3.0.120 → drydock_cli-3.0.122}/drydock/tuning.py +0 -0
- {drydock_cli-3.0.120 → drydock_cli-3.0.122}/drydock/web.py +0 -0
- {drydock_cli-3.0.120 → drydock_cli-3.0.122}/drydock_cli.egg-info/SOURCES.txt +0 -0
- {drydock_cli-3.0.120 → drydock_cli-3.0.122}/drydock_cli.egg-info/dependency_links.txt +0 -0
- {drydock_cli-3.0.120 → drydock_cli-3.0.122}/drydock_cli.egg-info/entry_points.txt +0 -0
- {drydock_cli-3.0.120 → drydock_cli-3.0.122}/drydock_cli.egg-info/requires.txt +0 -0
- {drydock_cli-3.0.120 → drydock_cli-3.0.122}/drydock_cli.egg-info/top_level.txt +0 -0
- {drydock_cli-3.0.120 → drydock_cli-3.0.122}/setup.cfg +0 -0
- {drydock_cli-3.0.120 → drydock_cli-3.0.122}/tests/test_advisor.py +0 -0
- {drydock_cli-3.0.120 → drydock_cli-3.0.122}/tests/test_approval.py +0 -0
- {drydock_cli-3.0.120 → drydock_cli-3.0.122}/tests/test_back_command.py +0 -0
- {drydock_cli-3.0.120 → drydock_cli-3.0.122}/tests/test_bash_background.py +0 -0
- {drydock_cli-3.0.120 → drydock_cli-3.0.122}/tests/test_bash_binary_output.py +0 -0
- {drydock_cli-3.0.120 → drydock_cli-3.0.122}/tests/test_bash_crossplatform.py +0 -0
- {drydock_cli-3.0.120 → drydock_cli-3.0.122}/tests/test_bash_output_bounding.py +0 -0
- {drydock_cli-3.0.120 → drydock_cli-3.0.122}/tests/test_bash_process_group.py +0 -0
- {drydock_cli-3.0.120 → drydock_cli-3.0.122}/tests/test_bash_safety.py +0 -0
- {drydock_cli-3.0.120 → drydock_cli-3.0.122}/tests/test_bash_sanitize.py +0 -0
- {drydock_cli-3.0.120 → drydock_cli-3.0.122}/tests/test_bash_shell.py +0 -0
- {drydock_cli-3.0.120 → drydock_cli-3.0.122}/tests/test_bash_stdin.py +0 -0
- {drydock_cli-3.0.120 → drydock_cli-3.0.122}/tests/test_bash_stop_partial.py +0 -0
- {drydock_cli-3.0.120 → drydock_cli-3.0.122}/tests/test_bash_timeout_network.py +0 -0
- {drydock_cli-3.0.120 → drydock_cli-3.0.122}/tests/test_bash_timeout_param.py +0 -0
- {drydock_cli-3.0.120 → drydock_cli-3.0.122}/tests/test_cci.py +0 -0
- {drydock_cli-3.0.120 → drydock_cli-3.0.122}/tests/test_cli_agents.py +0 -0
- {drydock_cli-3.0.120 → drydock_cli-3.0.122}/tests/test_compact_command.py +0 -0
- {drydock_cli-3.0.120 → drydock_cli-3.0.122}/tests/test_compaction.py +0 -0
- {drydock_cli-3.0.120 → drydock_cli-3.0.122}/tests/test_config.py +0 -0
- {drydock_cli-3.0.120 → drydock_cli-3.0.122}/tests/test_config_migration.py +0 -0
- {drydock_cli-3.0.120 → drydock_cli-3.0.122}/tests/test_context_limit_config.py +0 -0
- {drydock_cli-3.0.120 → drydock_cli-3.0.122}/tests/test_detect.py +0 -0
- {drydock_cli-3.0.120 → drydock_cli-3.0.122}/tests/test_dispatch.py +0 -0
- {drydock_cli-3.0.120 → drydock_cli-3.0.122}/tests/test_e2e_connected.py +0 -0
- {drydock_cli-3.0.120 → drydock_cli-3.0.122}/tests/test_edit_replace_all.py +0 -0
- {drydock_cli-3.0.120 → drydock_cli-3.0.122}/tests/test_empty_response.py +0 -0
- {drydock_cli-3.0.120 → drydock_cli-3.0.122}/tests/test_extract.py +0 -0
- {drydock_cli-3.0.120 → drydock_cli-3.0.122}/tests/test_failure_loop.py +0 -0
- {drydock_cli-3.0.120 → drydock_cli-3.0.122}/tests/test_first_run_setup.py +0 -0
- {drydock_cli-3.0.120 → drydock_cli-3.0.122}/tests/test_gittools.py +0 -0
- {drydock_cli-3.0.120 → drydock_cli-3.0.122}/tests/test_glob_edit_edges.py +0 -0
- {drydock_cli-3.0.120 → drydock_cli-3.0.122}/tests/test_graphify_example.py +0 -0
- {drydock_cli-3.0.120 → drydock_cli-3.0.122}/tests/test_graphrag.py +0 -0
- {drydock_cli-3.0.120 → drydock_cli-3.0.122}/tests/test_graphrag_quoted_path.py +0 -0
- {drydock_cli-3.0.120 → drydock_cli-3.0.122}/tests/test_grep_and_read_robust.py +0 -0
- {drydock_cli-3.0.120 → drydock_cli-3.0.122}/tests/test_guards_and_tools.py +0 -0
- {drydock_cli-3.0.120 → drydock_cli-3.0.122}/tests/test_hallucinated_tools.py +0 -0
- {drydock_cli-3.0.120 → drydock_cli-3.0.122}/tests/test_leaked_tool_call.py +0 -0
- {drydock_cli-3.0.120 → drydock_cli-3.0.122}/tests/test_loop_detect.py +0 -0
- {drydock_cli-3.0.120 → drydock_cli-3.0.122}/tests/test_mcp.py +0 -0
- {drydock_cli-3.0.120 → drydock_cli-3.0.122}/tests/test_oneshot_unreachable.py +0 -0
- {drydock_cli-3.0.120 → drydock_cli-3.0.122}/tests/test_overthink_interrupt.py +0 -0
- {drydock_cli-3.0.120 → drydock_cli-3.0.122}/tests/test_plan_autocontinue.py +0 -0
- {drydock_cli-3.0.120 → drydock_cli-3.0.122}/tests/test_poam.py +0 -0
- {drydock_cli-3.0.120 → drydock_cli-3.0.122}/tests/test_providers_unreachable.py +0 -0
- {drydock_cli-3.0.120 → drydock_cli-3.0.122}/tests/test_read_index.py +0 -0
- {drydock_cli-3.0.120 → drydock_cli-3.0.122}/tests/test_repetition_interrupt.py +0 -0
- {drydock_cli-3.0.120 → drydock_cli-3.0.122}/tests/test_rmf.py +0 -0
- {drydock_cli-3.0.120 → drydock_cli-3.0.122}/tests/test_rmf_graph.py +0 -0
- {drydock_cli-3.0.120 → drydock_cli-3.0.122}/tests/test_rmf_stig_graph.py +0 -0
- {drydock_cli-3.0.120 → drydock_cli-3.0.122}/tests/test_runaway_repetition.py +0 -0
- {drydock_cli-3.0.120 → drydock_cli-3.0.122}/tests/test_server_probe.py +0 -0
- {drydock_cli-3.0.120 → drydock_cli-3.0.122}/tests/test_stall_retry.py +0 -0
- {drydock_cli-3.0.120 → drydock_cli-3.0.122}/tests/test_stig.py +0 -0
- {drydock_cli-3.0.120 → drydock_cli-3.0.122}/tests/test_stop.py +0 -0
- {drydock_cli-3.0.120 → drydock_cli-3.0.122}/tests/test_streaming_newlines.py +0 -0
- {drydock_cli-3.0.120 → drydock_cli-3.0.122}/tests/test_subagent.py +0 -0
- {drydock_cli-3.0.120 → drydock_cli-3.0.122}/tests/test_system_prompt_help.py +0 -0
- {drydock_cli-3.0.120 → drydock_cli-3.0.122}/tests/test_todo.py +0 -0
- {drydock_cli-3.0.120 → drydock_cli-3.0.122}/tests/test_tool_arg_coercion.py +0 -0
- {drydock_cli-3.0.120 → drydock_cli-3.0.122}/tests/test_tool_arg_coercion_more.py +0 -0
- {drydock_cli-3.0.120 → drydock_cli-3.0.122}/tests/test_tool_arg_parsing.py +0 -0
- {drydock_cli-3.0.120 → drydock_cli-3.0.122}/tests/test_tools_undo.py +0 -0
- {drydock_cli-3.0.120 → drydock_cli-3.0.122}/tests/test_tui.py +0 -0
- {drydock_cli-3.0.120 → drydock_cli-3.0.122}/tests/test_tuning.py +0 -0
- {drydock_cli-3.0.120 → drydock_cli-3.0.122}/tests/test_viewimage.py +0 -0
- {drydock_cli-3.0.120 → drydock_cli-3.0.122}/tests/test_vision_input.py +0 -0
- {drydock_cli-3.0.120 → drydock_cli-3.0.122}/tests/test_web_tools.py +0 -0
- {drydock_cli-3.0.120 → drydock_cli-3.0.122}/tests/test_windows_shell.py +0 -0
- {drydock_cli-3.0.120 → drydock_cli-3.0.122}/tests/test_write_content_coerce.py +0 -0
- {drydock_cli-3.0.120 → drydock_cli-3.0.122}/tests/test_xccdf.py +0 -0
|
@@ -274,6 +274,8 @@ def retrieve_recipes(task_text: str, k: int = 2) -> list[tuple[str, str]]:
|
|
|
274
274
|
overlap. Empty if nothing scores — never inject irrelevant noise."""
|
|
275
275
|
if not task_text:
|
|
276
276
|
return []
|
|
277
|
+
if not isinstance(task_text, str): # defensive: never crash the agent loop
|
|
278
|
+
task_text = str(task_text)
|
|
277
279
|
words = set(_WORD.findall(task_text.lower()))
|
|
278
280
|
scored = []
|
|
279
281
|
for title, keywords, body in RECIPES:
|
|
@@ -750,6 +750,10 @@ def _capture_screen(out: str) -> str | None:
|
|
|
750
750
|
elif sys.platform == "darwin":
|
|
751
751
|
subprocess.run(["screencapture", "-x", out], capture_output=True, timeout=30)
|
|
752
752
|
else: # Linux/BSD — try grabbers in order of ubiquity (X11 + wayland)
|
|
753
|
+
if not (os.environ.get("DISPLAY") or os.environ.get("WAYLAND_DISPLAY")):
|
|
754
|
+
# Fail fast — a grabber on a headless box blocks until timeout.
|
|
755
|
+
return ("no display ($DISPLAY/$WAYLAND_DISPLAY unset) — cannot capture "
|
|
756
|
+
"the screen on a headless server.")
|
|
753
757
|
grabbers = (["scrot", "-o", out], ["import", "-window", "root", out],
|
|
754
758
|
["gnome-screenshot", "-f", out], ["grim", out],
|
|
755
759
|
["spectacle", "-b", "-n", "-o", out], ["maim", out])
|
|
@@ -84,6 +84,17 @@ def _fmt_tokens(n: int) -> str:
|
|
|
84
84
|
return f"{n / 1000:.1f}k" if n >= 1000 else str(n)
|
|
85
85
|
|
|
86
86
|
|
|
87
|
+
def is_slash_command(text: str) -> bool:
|
|
88
|
+
"""True only for a real ``/command``, NOT a message that merely starts with a
|
|
89
|
+
path — e.g. ``/app/env.py defines ...`` or ``/report.tex``. A command name is a
|
|
90
|
+
single leading token of word chars (no path separators, no dots); anything with
|
|
91
|
+
``/``, ``\\`` or ``.`` in that first token is treated as a normal agent message."""
|
|
92
|
+
if not text.startswith("/"):
|
|
93
|
+
return False
|
|
94
|
+
head = text[1:].split(maxsplit=1)[0] if len(text) > 1 else ""
|
|
95
|
+
return bool(head) and not any(c in head for c in "/\\.")
|
|
96
|
+
|
|
97
|
+
|
|
87
98
|
class DrydockApp(App):
|
|
88
99
|
CSS = """
|
|
89
100
|
Screen { background: #0b1f2a; }
|
|
@@ -425,7 +436,7 @@ class DrydockApp(App):
|
|
|
425
436
|
prompt.clear()
|
|
426
437
|
if not text:
|
|
427
438
|
return
|
|
428
|
-
if text
|
|
439
|
+
if is_slash_command(text):
|
|
429
440
|
self._handle_slash(text) # meta commands stay out of history
|
|
430
441
|
return
|
|
431
442
|
prompt.cmd_history.add(text)
|
|
@@ -7,7 +7,7 @@ build-backend = "setuptools.build_meta"
|
|
|
7
7
|
# PyPI distribution name is drydock-cli (the established install name, continued
|
|
8
8
|
# from the retired v2 fork); the import package + CLI command stay `drydock`.
|
|
9
9
|
name = "drydock-cli"
|
|
10
|
-
version = "3.0.
|
|
10
|
+
version = "3.0.122"
|
|
11
11
|
description = "Drydock — a local, provider-agnostic terminal coding agent for local LLMs"
|
|
12
12
|
readme = "README.md"
|
|
13
13
|
requires-python = ">=3.11"
|
|
@@ -61,3 +61,10 @@ def test_ml_skills_bundled():
|
|
|
61
61
|
for name in ("ml-train", "ml-metrics", "ml-finetune", "ml-debug", "ml-rl", "ml-data"):
|
|
62
62
|
assert name in sk, f"bundled ML skill /{name} missing"
|
|
63
63
|
assert "MCC" in sk["ml-metrics"].body or "mcc" in sk["ml-metrics"].body.lower()
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
def test_retrieve_handles_non_string():
|
|
67
|
+
from drydock.recipes import retrieve_recipes, recipe_context
|
|
68
|
+
for v in (b"train a cnn", ["train", "cnn"], 5, None):
|
|
69
|
+
assert isinstance(retrieve_recipes(v), list) # never raises
|
|
70
|
+
assert isinstance(recipe_context(123), str)
|
|
@@ -21,6 +21,7 @@ def test_registered_and_available_to_gemma():
|
|
|
21
21
|
def test_graceful_when_no_grabber(monkeypatch):
|
|
22
22
|
monkeypatch.setattr(tools, "_IS_WINDOWS", False)
|
|
23
23
|
monkeypatch.setattr("sys.platform", "linux")
|
|
24
|
+
monkeypatch.setenv("DISPLAY", ":0") # a display exists, but no grabber is installed
|
|
24
25
|
monkeypatch.setattr("shutil.which", lambda _n: None) # no grabbers installed
|
|
25
26
|
out = tools.tool_screenshot({}, {"cwd": os.getcwd()})
|
|
26
27
|
assert out.startswith("Error") and "screenshot tool" in out
|
|
@@ -57,3 +58,15 @@ def test_macos_uses_screencapture(monkeypatch):
|
|
|
57
58
|
monkeypatch.setattr("subprocess.run", lambda a, **k: calls.setdefault("argv", a))
|
|
58
59
|
tools._capture_screen("/tmp/x.png")
|
|
59
60
|
assert calls["argv"][0] == "screencapture"
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
def test_headless_linux_fails_fast(monkeypatch):
|
|
64
|
+
import time
|
|
65
|
+
monkeypatch.setattr(tools, "_IS_WINDOWS", False)
|
|
66
|
+
monkeypatch.setattr("sys.platform", "linux")
|
|
67
|
+
monkeypatch.delenv("DISPLAY", raising=False)
|
|
68
|
+
monkeypatch.delenv("WAYLAND_DISPLAY", raising=False)
|
|
69
|
+
t = time.time()
|
|
70
|
+
err = tools._capture_screen("/tmp/x.png")
|
|
71
|
+
assert time.time() - t < 1.0 # no 30s grabber hang
|
|
72
|
+
assert err and "display" in err.lower()
|
|
@@ -55,7 +55,11 @@ def test_empty_body_skipped(tmp_path):
|
|
|
55
55
|
def test_no_user_or_project_skills_yields_only_builtins(tmp_path):
|
|
56
56
|
# With no user/project skills, only the bundled built-ins (RMF) are present.
|
|
57
57
|
loaded = skills.load_skills(str(tmp_path))
|
|
58
|
-
assert set(loaded) == {
|
|
58
|
+
assert set(loaded) == {
|
|
59
|
+
"rmf-control", "rmf-categorize", "rmf-review", "rmf-poam",
|
|
60
|
+
"stig-assess", "stig-remediate",
|
|
61
|
+
"ml-train", "ml-metrics", "ml-finetune", "ml-debug", "ml-rl", "ml-data",
|
|
62
|
+
}
|
|
59
63
|
|
|
60
64
|
|
|
61
65
|
def test_create_skill_user_scope(tmp_path, monkeypatch):
|
|
@@ -18,3 +18,13 @@ def test_priority_and_cases():
|
|
|
18
18
|
def test_error_beats_plan_and_writes():
|
|
19
19
|
assert s(ctx_pct=10, wrote_files=True, ran_bash=True, had_error=True,
|
|
20
20
|
in_git=True, plan_remaining=True) == "fix the error above"
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def test_is_slash_command_distinguishes_paths():
|
|
24
|
+
from drydock.tui.app import is_slash_command as c
|
|
25
|
+
assert c("/help") and c("/ml-train foo") and c("/ask!") and c("/compact")
|
|
26
|
+
# file paths / messages starting with a path are NOT commands
|
|
27
|
+
assert not c("/app/env.py defines a gridworld")
|
|
28
|
+
assert not c("/report.tex")
|
|
29
|
+
assert not c("/data/file.h5 holds predictions")
|
|
30
|
+
assert not c("Train a model") and not c("/")
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|