moat-kv 0.71.12__tar.gz → 0.71.13__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.
- {moat_kv-0.71.12 → moat_kv-0.71.13}/PKG-INFO +1 -1
- {moat_kv-0.71.12 → moat_kv-0.71.13}/debian/changelog +6 -0
- {moat_kv-0.71.12 → moat_kv-0.71.13}/pyproject.toml +1 -1
- {moat_kv-0.71.12 → moat_kv-0.71.13}/src/moat/kv/command/acl.py +1 -1
- {moat_kv-0.71.12 → moat_kv-0.71.13}/src/moat/kv/command/data.py +3 -3
- {moat_kv-0.71.12 → moat_kv-0.71.13}/src/moat/kv/command/job.py +2 -1
- {moat_kv-0.71.12 → moat_kv-0.71.13}/src/moat/kv/data.py +33 -16
- {moat_kv-0.71.12 → moat_kv-0.71.13}/src/moat/kv/model.py +22 -8
- {moat_kv-0.71.12 → moat_kv-0.71.13}/src/moat/kv/server.py +7 -2
- {moat_kv-0.71.12 → moat_kv-0.71.13}/src/moat_kv.egg-info/PKG-INFO +1 -1
- {moat_kv-0.71.12 → moat_kv-0.71.13}/LICENSE +0 -0
- {moat_kv-0.71.12 → moat_kv-0.71.13}/LICENSE.APACHE2 +0 -0
- {moat_kv-0.71.12 → moat_kv-0.71.13}/LICENSE.MIT +0 -0
- {moat_kv-0.71.12 → moat_kv-0.71.13}/LICENSE.txt +0 -0
- {moat_kv-0.71.12 → moat_kv-0.71.13}/MANIFEST.in +0 -0
- {moat_kv-0.71.12 → moat_kv-0.71.13}/Makefile +0 -0
- {moat_kv-0.71.12 → moat_kv-0.71.13}/README.rst +0 -0
- {moat_kv-0.71.12 → moat_kv-0.71.13}/ci/rtd-requirements.txt +0 -0
- {moat_kv-0.71.12 → moat_kv-0.71.13}/ci/test-requirements.txt +0 -0
- {moat_kv-0.71.12 → moat_kv-0.71.13}/ci/travis.sh +0 -0
- {moat_kv-0.71.12 → moat_kv-0.71.13}/debian/.gitignore +0 -0
- {moat_kv-0.71.12 → moat_kv-0.71.13}/debian/control +0 -0
- {moat_kv-0.71.12 → moat_kv-0.71.13}/debian/moat-kv.postinst +0 -0
- {moat_kv-0.71.12 → moat_kv-0.71.13}/debian/rules +0 -0
- {moat_kv-0.71.12 → moat_kv-0.71.13}/debian/source/format +0 -0
- {moat_kv-0.71.12 → moat_kv-0.71.13}/docs/Makefile +0 -0
- {moat_kv-0.71.12 → moat_kv-0.71.13}/docs/make.bat +0 -0
- {moat_kv-0.71.12 → moat_kv-0.71.13}/docs/source/TODO.rst +0 -0
- {moat_kv-0.71.12 → moat_kv-0.71.13}/docs/source/_static/.gitkeep +0 -0
- {moat_kv-0.71.12 → moat_kv-0.71.13}/docs/source/acls.rst +0 -0
- {moat_kv-0.71.12 → moat_kv-0.71.13}/docs/source/auth.rst +0 -0
- {moat_kv-0.71.12 → moat_kv-0.71.13}/docs/source/client_protocol.rst +0 -0
- {moat_kv-0.71.12 → moat_kv-0.71.13}/docs/source/code.rst +0 -0
- {moat_kv-0.71.12 → moat_kv-0.71.13}/docs/source/command_line.rst +0 -0
- {moat_kv-0.71.12 → moat_kv-0.71.13}/docs/source/common_protocol.rst +0 -0
- {moat_kv-0.71.12 → moat_kv-0.71.13}/docs/source/conf.py +0 -0
- {moat_kv-0.71.12 → moat_kv-0.71.13}/docs/source/debugging.rst +0 -0
- {moat_kv-0.71.12 → moat_kv-0.71.13}/docs/source/extend.rst +0 -0
- {moat_kv-0.71.12 → moat_kv-0.71.13}/docs/source/history.rst +0 -0
- {moat_kv-0.71.12 → moat_kv-0.71.13}/docs/source/index.rst +0 -0
- {moat_kv-0.71.12 → moat_kv-0.71.13}/docs/source/model.rst +0 -0
- {moat_kv-0.71.12 → moat_kv-0.71.13}/docs/source/overview.rst +0 -0
- {moat_kv-0.71.12 → moat_kv-0.71.13}/docs/source/related.rst +0 -0
- {moat_kv-0.71.12 → moat_kv-0.71.13}/docs/source/server_protocol.rst +0 -0
- {moat_kv-0.71.12 → moat_kv-0.71.13}/docs/source/startup.rst +0 -0
- {moat_kv-0.71.12 → moat_kv-0.71.13}/docs/source/translator.rst +0 -0
- {moat_kv-0.71.12 → moat_kv-0.71.13}/docs/source/tutorial.rst +0 -0
- {moat_kv-0.71.12 → moat_kv-0.71.13}/docs/source/v3.rst +0 -0
- {moat_kv-0.71.12 → moat_kv-0.71.13}/examples/code/transform.scale.yml +0 -0
- {moat_kv-0.71.12 → moat_kv-0.71.13}/examples/code/transform.switch.yml +0 -0
- {moat_kv-0.71.12 → moat_kv-0.71.13}/examples/code/transform.timeslot.yml +0 -0
- {moat_kv-0.71.12 → moat_kv-0.71.13}/examples/pathify.py +0 -0
- {moat_kv-0.71.12 → moat_kv-0.71.13}/mktag +0 -0
- {moat_kv-0.71.12 → moat_kv-0.71.13}/scripts/current +0 -0
- {moat_kv-0.71.12 → moat_kv-0.71.13}/scripts/env +0 -0
- {moat_kv-0.71.12 → moat_kv-0.71.13}/scripts/init +0 -0
- {moat_kv-0.71.12 → moat_kv-0.71.13}/scripts/recover +0 -0
- {moat_kv-0.71.12 → moat_kv-0.71.13}/scripts/rotate +0 -0
- {moat_kv-0.71.12 → moat_kv-0.71.13}/scripts/run +0 -0
- {moat_kv-0.71.12 → moat_kv-0.71.13}/scripts/run-all +0 -0
- {moat_kv-0.71.12 → moat_kv-0.71.13}/scripts/run-any +0 -0
- {moat_kv-0.71.12 → moat_kv-0.71.13}/scripts/run-single +0 -0
- {moat_kv-0.71.12 → moat_kv-0.71.13}/scripts/success +0 -0
- {moat_kv-0.71.12 → moat_kv-0.71.13}/setup.cfg +0 -0
- {moat_kv-0.71.12 → moat_kv-0.71.13}/src/moat/kv/__init__.py +0 -0
- {moat_kv-0.71.12 → moat_kv-0.71.13}/src/moat/kv/_cfg.yaml +0 -0
- {moat_kv-0.71.12 → moat_kv-0.71.13}/src/moat/kv/_main.py +0 -0
- {moat_kv-0.71.12 → moat_kv-0.71.13}/src/moat/kv/actor/__init__.py +0 -0
- {moat_kv-0.71.12 → moat_kv-0.71.13}/src/moat/kv/actor/deletor.py +0 -0
- {moat_kv-0.71.12 → moat_kv-0.71.13}/src/moat/kv/auth/__init__.py +0 -0
- {moat_kv-0.71.12 → moat_kv-0.71.13}/src/moat/kv/auth/_test.py +0 -0
- {moat_kv-0.71.12 → moat_kv-0.71.13}/src/moat/kv/auth/password.py +0 -0
- {moat_kv-0.71.12 → moat_kv-0.71.13}/src/moat/kv/auth/root.py +0 -0
- {moat_kv-0.71.12 → moat_kv-0.71.13}/src/moat/kv/backend/__init__.py +0 -0
- {moat_kv-0.71.12 → moat_kv-0.71.13}/src/moat/kv/backend/mqtt.py +0 -0
- {moat_kv-0.71.12 → moat_kv-0.71.13}/src/moat/kv/client.py +0 -0
- {moat_kv-0.71.12 → moat_kv-0.71.13}/src/moat/kv/code.py +0 -0
- {moat_kv-0.71.12 → moat_kv-0.71.13}/src/moat/kv/command/__init__.py +0 -0
- {moat_kv-0.71.12 → moat_kv-0.71.13}/src/moat/kv/command/auth.py +0 -0
- {moat_kv-0.71.12 → moat_kv-0.71.13}/src/moat/kv/command/code.py +0 -0
- {moat_kv-0.71.12 → moat_kv-0.71.13}/src/moat/kv/command/codec.py +0 -0
- {moat_kv-0.71.12 → moat_kv-0.71.13}/src/moat/kv/command/dump/__init__.py +0 -0
- {moat_kv-0.71.12 → moat_kv-0.71.13}/src/moat/kv/command/error.py +0 -0
- {moat_kv-0.71.12 → moat_kv-0.71.13}/src/moat/kv/command/internal.py +0 -0
- {moat_kv-0.71.12 → moat_kv-0.71.13}/src/moat/kv/command/log.py +0 -0
- {moat_kv-0.71.12 → moat_kv-0.71.13}/src/moat/kv/command/server.py +0 -0
- {moat_kv-0.71.12 → moat_kv-0.71.13}/src/moat/kv/command/type.py +0 -0
- {moat_kv-0.71.12 → moat_kv-0.71.13}/src/moat/kv/config.py +0 -0
- {moat_kv-0.71.12 → moat_kv-0.71.13}/src/moat/kv/errors.py +0 -0
- {moat_kv-0.71.12 → moat_kv-0.71.13}/src/moat/kv/exceptions.py +0 -0
- {moat_kv-0.71.12 → moat_kv-0.71.13}/src/moat/kv/mock/__init__.py +0 -0
- {moat_kv-0.71.12 → moat_kv-0.71.13}/src/moat/kv/mock/mqtt.py +0 -0
- {moat_kv-0.71.12 → moat_kv-0.71.13}/src/moat/kv/mock/tracer.py +0 -0
- {moat_kv-0.71.12 → moat_kv-0.71.13}/src/moat/kv/obj/__init__.py +0 -0
- {moat_kv-0.71.12 → moat_kv-0.71.13}/src/moat/kv/obj/command.py +0 -0
- {moat_kv-0.71.12 → moat_kv-0.71.13}/src/moat/kv/runner.py +0 -0
- {moat_kv-0.71.12 → moat_kv-0.71.13}/src/moat/kv/types.py +0 -0
- {moat_kv-0.71.12 → moat_kv-0.71.13}/src/moat_kv.egg-info/SOURCES.txt +0 -0
- {moat_kv-0.71.12 → moat_kv-0.71.13}/src/moat_kv.egg-info/dependency_links.txt +0 -0
- {moat_kv-0.71.12 → moat_kv-0.71.13}/src/moat_kv.egg-info/requires.txt +0 -0
- {moat_kv-0.71.12 → moat_kv-0.71.13}/src/moat_kv.egg-info/top_level.txt +0 -0
- {moat_kv-0.71.12 → moat_kv-0.71.13}/systemd/moat-kv-recover.service +0 -0
- {moat_kv-0.71.12 → moat_kv-0.71.13}/systemd/moat-kv-rotate.service +0 -0
- {moat_kv-0.71.12 → moat_kv-0.71.13}/systemd/moat-kv-rotate.timer +0 -0
- {moat_kv-0.71.12 → moat_kv-0.71.13}/systemd/moat-kv-run-all.service +0 -0
- {moat_kv-0.71.12 → moat_kv-0.71.13}/systemd/moat-kv-run-all@.service +0 -0
- {moat_kv-0.71.12 → moat_kv-0.71.13}/systemd/moat-kv-run-any.service +0 -0
- {moat_kv-0.71.12 → moat_kv-0.71.13}/systemd/moat-kv-run-any@.service +0 -0
- {moat_kv-0.71.12 → moat_kv-0.71.13}/systemd/moat-kv-run-single.service +0 -0
- {moat_kv-0.71.12 → moat_kv-0.71.13}/systemd/moat-kv-run-single@.service +0 -0
- {moat_kv-0.71.12 → moat_kv-0.71.13}/systemd/moat-kv.service +0 -0
- {moat_kv-0.71.12 → moat_kv-0.71.13}/systemd/postinst +0 -0
- {moat_kv-0.71.12 → moat_kv-0.71.13}/systemd/sysusers +0 -0
@@ -46,7 +46,7 @@ async def list_(obj):
|
|
46
46
|
async def dump(obj, name, path, as_dict):
|
47
47
|
"""Dump a complete (or partial) ACL."""
|
48
48
|
path = P(path)
|
49
|
-
await data_get(obj, Path("acl", name, path), internal=True, as_dict=as_dict)
|
49
|
+
await data_get(obj.client, Path("acl", name, path), internal=True, as_dict=as_dict, out=obj.stdout)
|
50
50
|
|
51
51
|
|
52
52
|
@cli.command()
|
@@ -20,7 +20,7 @@ async def cli(ctx, path):
|
|
20
20
|
This subcommand accesses the actual user data stored in your MoaT-KV tree.
|
21
21
|
"""
|
22
22
|
if ctx.invoked_subcommand is None:
|
23
|
-
await data_get(ctx.obj, path, recursive=False)
|
23
|
+
await data_get(ctx.obj.client, path, recursive=False, out=ctx.obj.stdout)
|
24
24
|
else:
|
25
25
|
ctx.obj.path = path
|
26
26
|
|
@@ -61,7 +61,7 @@ async def get(obj, **k):
|
|
61
61
|
for incremental output.
|
62
62
|
"""
|
63
63
|
|
64
|
-
await data_get(obj, obj.path, **k)
|
64
|
+
await data_get(obj.client, obj.path, out=obj.stdout, **k)
|
65
65
|
|
66
66
|
|
67
67
|
@cli.command("list")
|
@@ -101,7 +101,7 @@ async def list_(obj, **k):
|
|
101
101
|
k["recursive"] = True
|
102
102
|
k["raw"] = True
|
103
103
|
k["empty"] = True
|
104
|
-
await data_get(obj, obj.path, **k)
|
104
|
+
await data_get(obj.client, obj.path, out=obj.stdout, **k)
|
105
105
|
|
106
106
|
|
107
107
|
@cli.command("set", short_help="Add or update an entry")
|
@@ -237,10 +237,11 @@ async def list_(obj, state, state_only, table, as_dict):
|
|
237
237
|
|
238
238
|
else:
|
239
239
|
await data_get(
|
240
|
-
obj,
|
240
|
+
obj.client,
|
241
241
|
obj.path + path,
|
242
242
|
as_dict=as_dict,
|
243
243
|
item_mangle=partial(_state_fix, obj, state, state_only, None if as_dict else path),
|
244
|
+
out=obj.stdout,
|
244
245
|
)
|
245
246
|
|
246
247
|
|
@@ -45,9 +45,10 @@ def add_dates(d):
|
|
45
45
|
|
46
46
|
|
47
47
|
async def data_get(
|
48
|
-
|
48
|
+
conn,
|
49
49
|
path,
|
50
50
|
*,
|
51
|
+
meta=False,
|
51
52
|
recursive=True,
|
52
53
|
as_dict="_",
|
53
54
|
maxdepth=-1,
|
@@ -58,6 +59,7 @@ async def data_get(
|
|
58
59
|
path_mangle=None,
|
59
60
|
item_mangle=None,
|
60
61
|
add_date=False,
|
62
|
+
out=None,
|
61
63
|
):
|
62
64
|
"""Generic code to dump a subtree.
|
63
65
|
|
@@ -75,6 +77,11 @@ async def data_get(
|
|
75
77
|
async def item_mangle(x): # pylint: disable=function-redefined
|
76
78
|
return x
|
77
79
|
|
80
|
+
if out is None:
|
81
|
+
out = sys.stdout
|
82
|
+
elif out is False:
|
83
|
+
out = []
|
84
|
+
|
78
85
|
if recursive:
|
79
86
|
kw = {}
|
80
87
|
if maxdepth is not None and maxdepth >= 0:
|
@@ -83,13 +90,13 @@ async def data_get(
|
|
83
90
|
kw["min_depth"] = mindepth
|
84
91
|
if empty:
|
85
92
|
kw["empty"] = True
|
86
|
-
if
|
87
|
-
kw.setdefault("nchain",
|
93
|
+
if meta:
|
94
|
+
kw.setdefault("nchain", meta)
|
88
95
|
y = {}
|
89
96
|
if internal:
|
90
|
-
res = await
|
97
|
+
res = await conn._request(action="get_tree_internal", path=path, iter=True, **kw)
|
91
98
|
else:
|
92
|
-
res =
|
99
|
+
res = conn.get_tree(path, **kw)
|
93
100
|
async for r in res:
|
94
101
|
r = await item_mangle(r)
|
95
102
|
if r is None:
|
@@ -107,7 +114,7 @@ async def data_get(
|
|
107
114
|
for p in path:
|
108
115
|
yy = yy.setdefault(p, {})
|
109
116
|
try:
|
110
|
-
yy[as_dict] = r if
|
117
|
+
yy[as_dict] = r if meta else r.value
|
111
118
|
except AttributeError:
|
112
119
|
if empty:
|
113
120
|
yy[as_dict] = None
|
@@ -117,13 +124,17 @@ async def data_get(
|
|
117
124
|
else:
|
118
125
|
y = {}
|
119
126
|
try:
|
120
|
-
y[path] = r if
|
127
|
+
y[path] = r if meta else r.value
|
121
128
|
except AttributeError:
|
122
129
|
if empty:
|
123
130
|
y[path] = None
|
124
131
|
else:
|
125
132
|
continue
|
126
|
-
|
133
|
+
|
134
|
+
if isinstance(out,list):
|
135
|
+
out.append(y)
|
136
|
+
else:
|
137
|
+
yprint([y], stream=out)
|
127
138
|
|
128
139
|
if as_dict is not None:
|
129
140
|
if maxdepth:
|
@@ -140,24 +151,30 @@ async def data_get(
|
|
140
151
|
return d
|
141
152
|
|
142
153
|
y = simplex(y)
|
143
|
-
|
154
|
+
if isinstance(out,list):
|
155
|
+
return y
|
156
|
+
yprint(y, stream=out)
|
144
157
|
return # end "if recursive"
|
145
158
|
|
146
|
-
res = await
|
147
|
-
if
|
159
|
+
res = await conn.get(path, nchain=meta)
|
160
|
+
if add_date and "value" in res:
|
161
|
+
add_dates(res.value)
|
162
|
+
if not meta:
|
148
163
|
try:
|
149
164
|
res = res.value
|
150
165
|
except AttributeError:
|
151
|
-
|
152
|
-
|
166
|
+
# if obj.debug:
|
167
|
+
# print("No data at", path, file=sys.stderr)
|
153
168
|
return
|
154
169
|
|
170
|
+
if out is False:
|
171
|
+
return d
|
155
172
|
if not raw:
|
156
|
-
yprint(res, stream=
|
173
|
+
yprint(res, stream=out)
|
157
174
|
elif isinstance(res, bytes):
|
158
|
-
os.write(
|
175
|
+
os.write(out.fileno(), res)
|
159
176
|
else:
|
160
|
-
|
177
|
+
out.write(str(res))
|
161
178
|
pass # end get
|
162
179
|
|
163
180
|
|
@@ -503,6 +503,18 @@ class NodeEvent:
|
|
503
503
|
res.prev = self.prev.serialize(nchain - 1)
|
504
504
|
return res
|
505
505
|
|
506
|
+
def serialize_link(self, nchain=-1) -> dict:
|
507
|
+
"Serialization for gatewaying to moat-link"
|
508
|
+
if not nchain:
|
509
|
+
raise RuntimeError("A chopped-off NodeEvent must not be sent")
|
510
|
+
res = []
|
511
|
+
s = self
|
512
|
+
while s is not None and nchain != 0:
|
513
|
+
res.extend((self.node.name, self.tick))
|
514
|
+
s = s.prev
|
515
|
+
nchain -= 1
|
516
|
+
return res
|
517
|
+
|
506
518
|
@classmethod
|
507
519
|
def deserialize(cls, msg, cache):
|
508
520
|
if msg is None:
|
@@ -518,6 +530,16 @@ class NodeEvent:
|
|
518
530
|
self.prev = cls.deserialize(msg["prev"], cache=cache)
|
519
531
|
return self
|
520
532
|
|
533
|
+
@classmethod
|
534
|
+
def deserialize_link(cls, msg, cache):
|
535
|
+
"Deserialization for gatewaying to moat-link"
|
536
|
+
if not msg:
|
537
|
+
return None
|
538
|
+
node,tick,*msg = msg
|
539
|
+
self = cls(node=Node(node, tick=tick, cache=cache), tick=tick)
|
540
|
+
self.prev = cls.deserialize_link(msg, cache=cache)
|
541
|
+
return self
|
542
|
+
|
521
543
|
def attach(self, prev: NodeEvent = None, server=None):
|
522
544
|
"""Copy this node, if necessary, and attach a filtered `prev` chain to it"""
|
523
545
|
if prev is not None:
|
@@ -702,10 +724,6 @@ class Entry:
|
|
702
724
|
|
703
725
|
first = True
|
704
726
|
for name in path:
|
705
|
-
if name is None and not nulls_ok:
|
706
|
-
raise ValueError("Null path element")
|
707
|
-
if nulls_ok == 1: # root only
|
708
|
-
nulls_ok = False
|
709
727
|
child = self._sub.get(name, None) if self is not None else None
|
710
728
|
if child is None:
|
711
729
|
if create is False:
|
@@ -738,10 +756,6 @@ class Entry:
|
|
738
756
|
# KEEP IN SYNC with `follow_acl`, above!
|
739
757
|
|
740
758
|
for name in path:
|
741
|
-
if name is None and not nulls_ok:
|
742
|
-
raise ValueError("Null path element")
|
743
|
-
if nulls_ok == 1: # root only
|
744
|
-
nulls_ok = False
|
745
759
|
child = self._sub.get(name, None) if self is not None else None
|
746
760
|
if child is None:
|
747
761
|
if create is False:
|
@@ -650,6 +650,11 @@ class SCmd_msg_monitor(StreamCommand):
|
|
650
650
|
try:
|
651
651
|
res["data"] = codec.decode(resp.payload)
|
652
652
|
except Exception as exc:
|
653
|
+
self.client.server.logger.exception(
|
654
|
+
"ERR %d: Client error on %s",
|
655
|
+
self.client._client_nr,
|
656
|
+
repr(exc),
|
657
|
+
)
|
653
658
|
res["raw"] = resp.payload
|
654
659
|
res["error"] = repr(exc)
|
655
660
|
|
@@ -1246,8 +1251,8 @@ class ServerClient:
|
|
1246
1251
|
msg = {"error": str(exc)}
|
1247
1252
|
if isinstance(exc, ClientError): # pylint doesn't seem to see this, so …:
|
1248
1253
|
msg["etype"] = exc.etype # pylint: disable=no-member ### YES IT HAS
|
1249
|
-
else:
|
1250
|
-
|
1254
|
+
#else:
|
1255
|
+
self.logger.exception(
|
1251
1256
|
"ERR %d: Client error on %s",
|
1252
1257
|
self._client_nr,
|
1253
1258
|
repr(msg),
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|