ms-tau-sdk 1.2.6.dev1__tar.gz → 1.2.6.dev3__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.
- {ms_tau_sdk-1.2.6.dev1 → ms_tau_sdk-1.2.6.dev3}/CHANGELOG.md +10 -0
- {ms_tau_sdk-1.2.6.dev1 → ms_tau_sdk-1.2.6.dev3}/PKG-INFO +12 -1
- {ms_tau_sdk-1.2.6.dev1 → ms_tau_sdk-1.2.6.dev3}/README.md +11 -0
- {ms_tau_sdk-1.2.6.dev1 → ms_tau_sdk-1.2.6.dev3}/pyproject.toml +1 -1
- ms_tau_sdk-1.2.6.dev3/src/ms_tau_sdk/resources/loader.py +30 -0
- {ms_tau_sdk-1.2.6.dev1 → ms_tau_sdk-1.2.6.dev3}/src/ms_tau_sdk/runtime/manager.py +4 -1
- {ms_tau_sdk-1.2.6.dev1 → ms_tau_sdk-1.2.6.dev3}/src/ms_tau_sdk/settings.py +25 -2
- ms_tau_sdk-1.2.6.dev1/src/ms_tau_sdk/resources/loader.py +0 -17
- {ms_tau_sdk-1.2.6.dev1 → ms_tau_sdk-1.2.6.dev3}/.gitignore +0 -0
- {ms_tau_sdk-1.2.6.dev1 → ms_tau_sdk-1.2.6.dev3}/src/ms_tau_sdk/__init__.py +0 -0
- {ms_tau_sdk-1.2.6.dev1 → ms_tau_sdk-1.2.6.dev3}/src/ms_tau_sdk/agent_skills/tau_a2a_runtime_adapter/SKILL.md +0 -0
- {ms_tau_sdk-1.2.6.dev1 → ms_tau_sdk-1.2.6.dev3}/src/ms_tau_sdk/agent_skills/tau_local_development/SKILL.md +0 -0
- {ms_tau_sdk-1.2.6.dev1 → ms_tau_sdk-1.2.6.dev3}/src/ms_tau_sdk/agent_skills/tau_project_customization/SKILL.md +0 -0
- {ms_tau_sdk-1.2.6.dev1 → ms_tau_sdk-1.2.6.dev3}/src/ms_tau_sdk/agent_skills/tau_repository_integration/SKILL.md +0 -0
- {ms_tau_sdk-1.2.6.dev1 → ms_tau_sdk-1.2.6.dev3}/src/ms_tau_sdk/api/__init__.py +0 -0
- {ms_tau_sdk-1.2.6.dev1 → ms_tau_sdk-1.2.6.dev3}/src/ms_tau_sdk/api/a2a.py +0 -0
- {ms_tau_sdk-1.2.6.dev1 → ms_tau_sdk-1.2.6.dev3}/src/ms_tau_sdk/api/chat.py +0 -0
- {ms_tau_sdk-1.2.6.dev1 → ms_tau_sdk-1.2.6.dev3}/src/ms_tau_sdk/api/dependencies.py +0 -0
- {ms_tau_sdk-1.2.6.dev1 → ms_tau_sdk-1.2.6.dev3}/src/ms_tau_sdk/api/health.py +0 -0
- {ms_tau_sdk-1.2.6.dev1 → ms_tau_sdk-1.2.6.dev3}/src/ms_tau_sdk/api/models.py +0 -0
- {ms_tau_sdk-1.2.6.dev1 → ms_tau_sdk-1.2.6.dev3}/src/ms_tau_sdk/api/sessions.py +0 -0
- {ms_tau_sdk-1.2.6.dev1 → ms_tau_sdk-1.2.6.dev3}/src/ms_tau_sdk/app.py +0 -0
- {ms_tau_sdk-1.2.6.dev1 → ms_tau_sdk-1.2.6.dev3}/src/ms_tau_sdk/application.py +0 -0
- {ms_tau_sdk-1.2.6.dev1 → ms_tau_sdk-1.2.6.dev3}/src/ms_tau_sdk/backend/__init__.py +0 -0
- {ms_tau_sdk-1.2.6.dev1 → ms_tau_sdk-1.2.6.dev3}/src/ms_tau_sdk/backend/auth.py +0 -0
- {ms_tau_sdk-1.2.6.dev1 → ms_tau_sdk-1.2.6.dev3}/src/ms_tau_sdk/backend/client.py +0 -0
- {ms_tau_sdk-1.2.6.dev1 → ms_tau_sdk-1.2.6.dev3}/src/ms_tau_sdk/backend/local.py +0 -0
- {ms_tau_sdk-1.2.6.dev1 → ms_tau_sdk-1.2.6.dev3}/src/ms_tau_sdk/backend/mcp.py +0 -0
- {ms_tau_sdk-1.2.6.dev1 → ms_tau_sdk-1.2.6.dev3}/src/ms_tau_sdk/backend/models.py +0 -0
- {ms_tau_sdk-1.2.6.dev1 → ms_tau_sdk-1.2.6.dev3}/src/ms_tau_sdk/backend/routes.py +0 -0
- {ms_tau_sdk-1.2.6.dev1 → ms_tau_sdk-1.2.6.dev3}/src/ms_tau_sdk/cli.py +0 -0
- {ms_tau_sdk-1.2.6.dev1 → ms_tau_sdk-1.2.6.dev3}/src/ms_tau_sdk/errors.py +0 -0
- {ms_tau_sdk-1.2.6.dev1 → ms_tau_sdk-1.2.6.dev3}/src/ms_tau_sdk/logging.py +0 -0
- {ms_tau_sdk-1.2.6.dev1 → ms_tau_sdk-1.2.6.dev3}/src/ms_tau_sdk/protocols/__init__.py +0 -0
- {ms_tau_sdk-1.2.6.dev1 → ms_tau_sdk-1.2.6.dev3}/src/ms_tau_sdk/protocols/a2a_message.py +0 -0
- {ms_tau_sdk-1.2.6.dev1 → ms_tau_sdk-1.2.6.dev3}/src/ms_tau_sdk/protocols/a2a_roles.py +0 -0
- {ms_tau_sdk-1.2.6.dev1 → ms_tau_sdk-1.2.6.dev3}/src/ms_tau_sdk/protocols/assistant_ui.py +0 -0
- {ms_tau_sdk-1.2.6.dev1 → ms_tau_sdk-1.2.6.dev3}/src/ms_tau_sdk/protocols/strict_json.py +0 -0
- {ms_tau_sdk-1.2.6.dev1 → ms_tau_sdk-1.2.6.dev3}/src/ms_tau_sdk/providers/__init__.py +0 -0
- {ms_tau_sdk-1.2.6.dev1 → ms_tau_sdk-1.2.6.dev3}/src/ms_tau_sdk/providers/definitions.py +0 -0
- {ms_tau_sdk-1.2.6.dev1 → ms_tau_sdk-1.2.6.dev3}/src/ms_tau_sdk/providers/factory.py +0 -0
- {ms_tau_sdk-1.2.6.dev1 → ms_tau_sdk-1.2.6.dev3}/src/ms_tau_sdk/resources/SYSTEM.md +0 -0
- {ms_tau_sdk-1.2.6.dev1 → ms_tau_sdk-1.2.6.dev3}/src/ms_tau_sdk/resources/__init__.py +0 -0
- {ms_tau_sdk-1.2.6.dev1 → ms_tau_sdk-1.2.6.dev3}/src/ms_tau_sdk/resources/prompts/review-code-repository.md +0 -0
- {ms_tau_sdk-1.2.6.dev1 → ms_tau_sdk-1.2.6.dev3}/src/ms_tau_sdk/runtime/__init__.py +0 -0
- {ms_tau_sdk-1.2.6.dev1 → ms_tau_sdk-1.2.6.dev3}/src/ms_tau_sdk/runtime/deployment_health.py +0 -0
- {ms_tau_sdk-1.2.6.dev1 → ms_tau_sdk-1.2.6.dev3}/src/ms_tau_sdk/runtime/events.py +0 -0
- {ms_tau_sdk-1.2.6.dev1 → ms_tau_sdk-1.2.6.dev3}/src/ms_tau_sdk/runtime/extensions.py +0 -0
- {ms_tau_sdk-1.2.6.dev1 → ms_tau_sdk-1.2.6.dev3}/src/ms_tau_sdk/runtime/failures.py +0 -0
- {ms_tau_sdk-1.2.6.dev1 → ms_tau_sdk-1.2.6.dev3}/src/ms_tau_sdk/runtime/observability.py +0 -0
- {ms_tau_sdk-1.2.6.dev1 → ms_tau_sdk-1.2.6.dev3}/src/ms_tau_sdk/runtime/provenance.py +0 -0
- {ms_tau_sdk-1.2.6.dev1 → ms_tau_sdk-1.2.6.dev3}/src/ms_tau_sdk/runtime/session.py +0 -0
- {ms_tau_sdk-1.2.6.dev1 → ms_tau_sdk-1.2.6.dev3}/src/ms_tau_sdk/runtime/snapshots.py +0 -0
- {ms_tau_sdk-1.2.6.dev1 → ms_tau_sdk-1.2.6.dev3}/src/ms_tau_sdk/runtime/task_context.py +0 -0
- {ms_tau_sdk-1.2.6.dev1 → ms_tau_sdk-1.2.6.dev3}/src/ms_tau_sdk/sessions/__init__.py +0 -0
- {ms_tau_sdk-1.2.6.dev1 → ms_tau_sdk-1.2.6.dev3}/src/ms_tau_sdk/sessions/storage.py +0 -0
- {ms_tau_sdk-1.2.6.dev1 → ms_tau_sdk-1.2.6.dev3}/src/ms_tau_sdk/skills.py +0 -0
- {ms_tau_sdk-1.2.6.dev1 → ms_tau_sdk-1.2.6.dev3}/src/ms_tau_sdk/tools/__init__.py +0 -0
- {ms_tau_sdk-1.2.6.dev1 → ms_tau_sdk-1.2.6.dev3}/src/ms_tau_sdk/tools/mainsequence_mcp.py +0 -0
- {ms_tau_sdk-1.2.6.dev1 → ms_tau_sdk-1.2.6.dev3}/src/ms_tau_sdk/tools/task_control.py +0 -0
|
@@ -2,6 +2,16 @@
|
|
|
2
2
|
|
|
3
3
|
## Unreleased
|
|
4
4
|
|
|
5
|
+
- Moved durable Tau runtime state out of the installed package. Built-in extension state, provider
|
|
6
|
+
credentials, project trust, and agent-call diagnostics now live under
|
|
7
|
+
`MAINSEQUENCE_TAU_STATE_ROOT/<workspace-hash>`, defaulting to an XDG-style user state directory,
|
|
8
|
+
instead of `ms_tau_sdk/resources/`. An installed wheel no longer writes to its own site-packages
|
|
9
|
+
directory, so a read-only install works, and a test run no longer leaves runtime files in `src`
|
|
10
|
+
for the next build to package. Managed-mode and local-mode behavior is otherwise unchanged.
|
|
11
|
+
- Made the release gate reject runtime residue. `scripts/verify_distribution.py` now holds an
|
|
12
|
+
explicit allowlist of the entries and file types the package ships, and refuses any `state/`
|
|
13
|
+
directory, so this class of leak fails the gate instead of shipping.
|
|
14
|
+
|
|
5
15
|
- Adopted one branch and release standard. A final release is a `vX.Y.Z` tag on `main`, and the
|
|
6
16
|
publish workflow refuses a tag whose commit `main` does not contain. Every push to `development`
|
|
7
17
|
publishes one `X.Y.Z.devN` release automatically, after the same quality gate as `quality.yml`
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: ms-tau-sdk
|
|
3
|
-
Version: 1.2.6.
|
|
3
|
+
Version: 1.2.6.dev3
|
|
4
4
|
Summary: Workspace-bound Tau application primitives for Main Sequence projects
|
|
5
5
|
Project-URL: Changelog, https://github.com/mainsequence-sdk/ms-tau-sdk/blob/development/CHANGELOG.md
|
|
6
6
|
Project-URL: Documentation, https://github.com/mainsequence-sdk/ms-tau-sdk/tree/development/docs
|
|
@@ -43,6 +43,7 @@ Description-Content-Type: text/markdown
|
|
|
43
43
|
<a href="https://pypi.org/project/ms-tau-sdk/"><img src="https://img.shields.io/pypi/pyversions/ms-tau-sdk.svg" alt="Supported Python versions"></a>
|
|
44
44
|
<a href="https://github.com/mainsequence-sdk/ms-tau-sdk/actions/workflows/quality.yml"><img src="https://github.com/mainsequence-sdk/ms-tau-sdk/actions/workflows/quality.yml/badge.svg?branch=development" alt="Quality checks"></a>
|
|
45
45
|
<a href="https://github.com/mainsequence-sdk/ms-tau-sdk/actions/workflows/publish-to-pipy.yml"><img src="https://github.com/mainsequence-sdk/ms-tau-sdk/actions/workflows/publish-to-pipy.yml/badge.svg" alt="PyPI publication"></a>
|
|
46
|
+
<a href="https://github.com/mainsequence-sdk/ms-tau-sdk/actions/workflows/publish-development-release.yml"><img src="https://github.com/mainsequence-sdk/ms-tau-sdk/actions/workflows/publish-development-release.yml/badge.svg?branch=development" alt="Development release publication"></a>
|
|
46
47
|
<a href="https://github.com/mainsequence-sdk/ms-tau-sdk/issues"><img src="https://img.shields.io/github/issues/mainsequence-sdk/ms-tau-sdk.svg" alt="Open issues"></a>
|
|
47
48
|
</p>
|
|
48
49
|
|
|
@@ -68,6 +69,16 @@ Add the SDK to the project that will host the agent:
|
|
|
68
69
|
uv add ms-tau-sdk
|
|
69
70
|
```
|
|
70
71
|
|
|
72
|
+
Every push to `development` also publishes one `X.Y.Z.devN` release to the same PyPI project.
|
|
73
|
+
`pip` and `uv` skip development releases, so take one only on purpose:
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
uv add --prerelease=allow ms-tau-sdk # or pin one exactly: uv add "ms-tau-sdk==X.Y.Z.devN"
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
See the [release process](docs/reference/releasing.md#registry-publication) for what each workflow
|
|
80
|
+
publishes.
|
|
81
|
+
|
|
71
82
|
Provide the runtime credential that Main Sequence assigned to the deployment:
|
|
72
83
|
|
|
73
84
|
```bash
|
|
@@ -15,6 +15,7 @@
|
|
|
15
15
|
<a href="https://pypi.org/project/ms-tau-sdk/"><img src="https://img.shields.io/pypi/pyversions/ms-tau-sdk.svg" alt="Supported Python versions"></a>
|
|
16
16
|
<a href="https://github.com/mainsequence-sdk/ms-tau-sdk/actions/workflows/quality.yml"><img src="https://github.com/mainsequence-sdk/ms-tau-sdk/actions/workflows/quality.yml/badge.svg?branch=development" alt="Quality checks"></a>
|
|
17
17
|
<a href="https://github.com/mainsequence-sdk/ms-tau-sdk/actions/workflows/publish-to-pipy.yml"><img src="https://github.com/mainsequence-sdk/ms-tau-sdk/actions/workflows/publish-to-pipy.yml/badge.svg" alt="PyPI publication"></a>
|
|
18
|
+
<a href="https://github.com/mainsequence-sdk/ms-tau-sdk/actions/workflows/publish-development-release.yml"><img src="https://github.com/mainsequence-sdk/ms-tau-sdk/actions/workflows/publish-development-release.yml/badge.svg?branch=development" alt="Development release publication"></a>
|
|
18
19
|
<a href="https://github.com/mainsequence-sdk/ms-tau-sdk/issues"><img src="https://img.shields.io/github/issues/mainsequence-sdk/ms-tau-sdk.svg" alt="Open issues"></a>
|
|
19
20
|
</p>
|
|
20
21
|
|
|
@@ -40,6 +41,16 @@ Add the SDK to the project that will host the agent:
|
|
|
40
41
|
uv add ms-tau-sdk
|
|
41
42
|
```
|
|
42
43
|
|
|
44
|
+
Every push to `development` also publishes one `X.Y.Z.devN` release to the same PyPI project.
|
|
45
|
+
`pip` and `uv` skip development releases, so take one only on purpose:
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
uv add --prerelease=allow ms-tau-sdk # or pin one exactly: uv add "ms-tau-sdk==X.Y.Z.devN"
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
See the [release process](docs/reference/releasing.md#registry-publication) for what each workflow
|
|
52
|
+
publishes.
|
|
53
|
+
|
|
43
54
|
Provide the runtime credential that Main Sequence assigned to the deployment:
|
|
44
55
|
|
|
45
56
|
```bash
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"""Packaged Tau resource paths with project-native override semantics."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from importlib.resources import files
|
|
6
|
+
from pathlib import Path
|
|
7
|
+
|
|
8
|
+
from tau_coding.paths import TauPaths
|
|
9
|
+
from tau_coding.resources import TauResourcePaths
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def resource_root() -> Path:
|
|
13
|
+
return Path(str(files("ms_tau_sdk.resources")))
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def tau_resource_paths(cwd: Path, *, state_home: Path) -> TauResourcePaths:
|
|
17
|
+
"""Return SDK defaults plus Tau-native project resource discovery.
|
|
18
|
+
|
|
19
|
+
`root` stays on the packaged resources, which are read-only inputs: an
|
|
20
|
+
installed wheel lives in site-packages, so the SDK must never write there.
|
|
21
|
+
`paths` therefore sends every durable Tau write — built-in extension state,
|
|
22
|
+
provider credentials, project trust, diagnostics, sessions — to the
|
|
23
|
+
writable `state_home` instead.
|
|
24
|
+
"""
|
|
25
|
+
return TauResourcePaths(
|
|
26
|
+
root=resource_root(),
|
|
27
|
+
cwd=cwd,
|
|
28
|
+
agents_root=None,
|
|
29
|
+
paths=TauPaths(home=state_home),
|
|
30
|
+
)
|
|
@@ -426,7 +426,10 @@ class SessionRuntimeManager:
|
|
|
426
426
|
tools=tools,
|
|
427
427
|
session_id=session_uid,
|
|
428
428
|
append_system_prompt=mainsequence_mcp_resource_prompt(mcp_client),
|
|
429
|
-
resource_paths=tau_resource_paths(
|
|
429
|
+
resource_paths=tau_resource_paths(
|
|
430
|
+
cwd,
|
|
431
|
+
state_home=self.settings.tau_state_home,
|
|
432
|
+
),
|
|
430
433
|
project_extensions_enabled=True,
|
|
431
434
|
trust_override="approve",
|
|
432
435
|
)
|
|
@@ -14,6 +14,13 @@ from pydantic_settings import BaseSettings, SettingsConfigDict
|
|
|
14
14
|
from .errors import ConfigurationError
|
|
15
15
|
|
|
16
16
|
|
|
17
|
+
def _default_state_root() -> Path:
|
|
18
|
+
"""Return the XDG-style user state directory for SDK-owned runtime state."""
|
|
19
|
+
override = os.environ.get("XDG_STATE_HOME", "").strip()
|
|
20
|
+
base = Path(override) if override else Path.home() / ".local" / "state"
|
|
21
|
+
return base / "ms-tau-sdk"
|
|
22
|
+
|
|
23
|
+
|
|
17
24
|
class TauSDKSettings(BaseSettings):
|
|
18
25
|
model_config = SettingsConfigDict(
|
|
19
26
|
env_file=".env",
|
|
@@ -66,6 +73,10 @@ class TauSDKSettings(BaseSettings):
|
|
|
66
73
|
default_factory=lambda: Path.home() / ".tau" / "mainsequence",
|
|
67
74
|
validation_alias="TAU_LOCAL_STATE_ROOT",
|
|
68
75
|
)
|
|
76
|
+
state_root: Path = Field(
|
|
77
|
+
default_factory=_default_state_root,
|
|
78
|
+
validation_alias="MAINSEQUENCE_TAU_STATE_ROOT",
|
|
79
|
+
)
|
|
69
80
|
host: str = Field(default="0.0.0.0", validation_alias="MAINSEQUENCE_TAU_HOST")
|
|
70
81
|
port: int = Field(default=8787, validation_alias="MAINSEQUENCE_TAU_PORT")
|
|
71
82
|
trusted_origins: tuple[str, ...] = Field(
|
|
@@ -240,9 +251,9 @@ class TauSDKSettings(BaseSettings):
|
|
|
240
251
|
normalized = str(value or "").strip()
|
|
241
252
|
return normalized or None
|
|
242
253
|
|
|
243
|
-
@field_validator("local_state_root")
|
|
254
|
+
@field_validator("local_state_root", "state_root")
|
|
244
255
|
@classmethod
|
|
245
|
-
def
|
|
256
|
+
def normalize_state_roots(cls, value: Path) -> Path:
|
|
246
257
|
return value.expanduser().resolve()
|
|
247
258
|
|
|
248
259
|
@model_validator(mode="after")
|
|
@@ -291,6 +302,18 @@ class TauSDKSettings(BaseSettings):
|
|
|
291
302
|
def workspace_digest(self) -> str:
|
|
292
303
|
return sha256(str(self.workspace).encode("utf-8")).hexdigest()[:12]
|
|
293
304
|
|
|
305
|
+
@property
|
|
306
|
+
def tau_state_home(self) -> Path:
|
|
307
|
+
"""Return the writable Tau home holding this workspace's runtime state.
|
|
308
|
+
|
|
309
|
+
Tau keeps durable runtime data (built-in extension state, provider
|
|
310
|
+
credentials, project trust, diagnostics) under one home directory. That
|
|
311
|
+
home must never be the packaged resource directory: an installed wheel
|
|
312
|
+
lives in site-packages, which is read-only on hardened installs and must
|
|
313
|
+
not mutate itself at runtime.
|
|
314
|
+
"""
|
|
315
|
+
return self.state_root / self.workspace_digest
|
|
316
|
+
|
|
294
317
|
@property
|
|
295
318
|
def local_state_path(self) -> Path:
|
|
296
319
|
return self.local_state_root / self.workspace_digest / "runtime.sqlite3"
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
"""Packaged Tau resource paths with project-native override semantics."""
|
|
2
|
-
|
|
3
|
-
from __future__ import annotations
|
|
4
|
-
|
|
5
|
-
from importlib.resources import files
|
|
6
|
-
from pathlib import Path
|
|
7
|
-
|
|
8
|
-
from tau_coding.resources import TauResourcePaths
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
def resource_root() -> Path:
|
|
12
|
-
return Path(str(files("ms_tau_sdk.resources")))
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
def tau_resource_paths(cwd: Path) -> TauResourcePaths:
|
|
16
|
-
"""Return SDK defaults plus Tau-native project resource discovery."""
|
|
17
|
-
return TauResourcePaths(root=resource_root(), cwd=cwd, agents_root=None)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|