flow.record 3.16.dev1__tar.gz → 3.16.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.
- {flow_record-3.16.dev1/flow.record.egg-info → flow_record-3.16.dev3}/PKG-INFO +1 -1
- {flow_record-3.16.dev1 → flow_record-3.16.dev3}/flow/record/base.py +3 -5
- {flow_record-3.16.dev1 → flow_record-3.16.dev3}/flow/record/fieldtypes/__init__.py +13 -2
- {flow_record-3.16.dev1 → flow_record-3.16.dev3}/flow/record/stream.py +2 -1
- {flow_record-3.16.dev1 → flow_record-3.16.dev3}/flow/record/utils.py +38 -2
- {flow_record-3.16.dev1 → flow_record-3.16.dev3}/flow/record/version.py +2 -2
- {flow_record-3.16.dev1 → flow_record-3.16.dev3/flow.record.egg-info}/PKG-INFO +1 -1
- {flow_record-3.16.dev1 → flow_record-3.16.dev3}/tests/test_fieldtypes.py +77 -3
- {flow_record-3.16.dev1 → flow_record-3.16.dev3}/COPYRIGHT +0 -0
- {flow_record-3.16.dev1 → flow_record-3.16.dev3}/LICENSE +0 -0
- {flow_record-3.16.dev1 → flow_record-3.16.dev3}/MANIFEST.in +0 -0
- {flow_record-3.16.dev1 → flow_record-3.16.dev3}/README.md +0 -0
- {flow_record-3.16.dev1 → flow_record-3.16.dev3}/examples/filesystem.py +0 -0
- {flow_record-3.16.dev1 → flow_record-3.16.dev3}/examples/passivedns.py +0 -0
- {flow_record-3.16.dev1 → flow_record-3.16.dev3}/examples/records.json +0 -0
- {flow_record-3.16.dev1 → flow_record-3.16.dev3}/examples/tcpconn.py +0 -0
- {flow_record-3.16.dev1 → flow_record-3.16.dev3}/flow/record/__init__.py +0 -0
- {flow_record-3.16.dev1 → flow_record-3.16.dev3}/flow/record/adapter/__init__.py +0 -0
- {flow_record-3.16.dev1 → flow_record-3.16.dev3}/flow/record/adapter/archive.py +0 -0
- {flow_record-3.16.dev1 → flow_record-3.16.dev3}/flow/record/adapter/avro.py +0 -0
- {flow_record-3.16.dev1 → flow_record-3.16.dev3}/flow/record/adapter/broker.py +0 -0
- {flow_record-3.16.dev1 → flow_record-3.16.dev3}/flow/record/adapter/csvfile.py +0 -0
- {flow_record-3.16.dev1 → flow_record-3.16.dev3}/flow/record/adapter/duckdb.py +0 -0
- {flow_record-3.16.dev1 → flow_record-3.16.dev3}/flow/record/adapter/elastic.py +0 -0
- {flow_record-3.16.dev1 → flow_record-3.16.dev3}/flow/record/adapter/jsonfile.py +0 -0
- {flow_record-3.16.dev1 → flow_record-3.16.dev3}/flow/record/adapter/line.py +0 -0
- {flow_record-3.16.dev1 → flow_record-3.16.dev3}/flow/record/adapter/mongo.py +0 -0
- {flow_record-3.16.dev1 → flow_record-3.16.dev3}/flow/record/adapter/split.py +0 -0
- {flow_record-3.16.dev1 → flow_record-3.16.dev3}/flow/record/adapter/splunk.py +0 -0
- {flow_record-3.16.dev1 → flow_record-3.16.dev3}/flow/record/adapter/sqlite.py +0 -0
- {flow_record-3.16.dev1 → flow_record-3.16.dev3}/flow/record/adapter/stream.py +0 -0
- {flow_record-3.16.dev1 → flow_record-3.16.dev3}/flow/record/adapter/text.py +0 -0
- {flow_record-3.16.dev1 → flow_record-3.16.dev3}/flow/record/adapter/xlsx.py +0 -0
- {flow_record-3.16.dev1 → flow_record-3.16.dev3}/flow/record/exceptions.py +0 -0
- {flow_record-3.16.dev1 → flow_record-3.16.dev3}/flow/record/fieldtypes/credential.py +0 -0
- {flow_record-3.16.dev1 → flow_record-3.16.dev3}/flow/record/fieldtypes/net/__init__.py +0 -0
- {flow_record-3.16.dev1 → flow_record-3.16.dev3}/flow/record/fieldtypes/net/ip.py +0 -0
- {flow_record-3.16.dev1 → flow_record-3.16.dev3}/flow/record/fieldtypes/net/ipv4.py +0 -0
- {flow_record-3.16.dev1 → flow_record-3.16.dev3}/flow/record/fieldtypes/net/tcp.py +0 -0
- {flow_record-3.16.dev1 → flow_record-3.16.dev3}/flow/record/fieldtypes/net/udp.py +0 -0
- {flow_record-3.16.dev1 → flow_record-3.16.dev3}/flow/record/jsonpacker.py +0 -0
- {flow_record-3.16.dev1 → flow_record-3.16.dev3}/flow/record/packer.py +0 -0
- {flow_record-3.16.dev1 → flow_record-3.16.dev3}/flow/record/selector.py +0 -0
- {flow_record-3.16.dev1 → flow_record-3.16.dev3}/flow/record/tools/__init__.py +0 -0
- {flow_record-3.16.dev1 → flow_record-3.16.dev3}/flow/record/tools/geoip.py +0 -0
- {flow_record-3.16.dev1 → flow_record-3.16.dev3}/flow/record/tools/rdump.py +0 -0
- {flow_record-3.16.dev1 → flow_record-3.16.dev3}/flow/record/whitelist.py +0 -0
- {flow_record-3.16.dev1 → flow_record-3.16.dev3}/flow.record.egg-info/SOURCES.txt +0 -0
- {flow_record-3.16.dev1 → flow_record-3.16.dev3}/flow.record.egg-info/dependency_links.txt +0 -0
- {flow_record-3.16.dev1 → flow_record-3.16.dev3}/flow.record.egg-info/entry_points.txt +0 -0
- {flow_record-3.16.dev1 → flow_record-3.16.dev3}/flow.record.egg-info/requires.txt +0 -0
- {flow_record-3.16.dev1 → flow_record-3.16.dev3}/flow.record.egg-info/top_level.txt +0 -0
- {flow_record-3.16.dev1 → flow_record-3.16.dev3}/pyproject.toml +0 -0
- {flow_record-3.16.dev1 → flow_record-3.16.dev3}/setup.cfg +0 -0
- {flow_record-3.16.dev1 → flow_record-3.16.dev3}/tests/__init__.py +0 -0
- {flow_record-3.16.dev1 → flow_record-3.16.dev3}/tests/_utils.py +0 -0
- {flow_record-3.16.dev1 → flow_record-3.16.dev3}/tests/docs/Makefile +0 -0
- {flow_record-3.16.dev1 → flow_record-3.16.dev3}/tests/docs/conf.py +0 -0
- {flow_record-3.16.dev1 → flow_record-3.16.dev3}/tests/docs/index.rst +0 -0
- {flow_record-3.16.dev1 → flow_record-3.16.dev3}/tests/selector_explain_example.py +0 -0
- {flow_record-3.16.dev1 → flow_record-3.16.dev3}/tests/standalone_test.py +0 -0
- {flow_record-3.16.dev1 → flow_record-3.16.dev3}/tests/test_avro.py +0 -0
- {flow_record-3.16.dev1 → flow_record-3.16.dev3}/tests/test_avro_adapter.py +0 -0
- {flow_record-3.16.dev1 → flow_record-3.16.dev3}/tests/test_compiled_selector.py +0 -0
- {flow_record-3.16.dev1 → flow_record-3.16.dev3}/tests/test_csv_adapter.py +0 -0
- {flow_record-3.16.dev1 → flow_record-3.16.dev3}/tests/test_deprecations.py +0 -0
- {flow_record-3.16.dev1 → flow_record-3.16.dev3}/tests/test_elastic_adapter.py +0 -0
- {flow_record-3.16.dev1 → flow_record-3.16.dev3}/tests/test_fieldtype_ip.py +0 -0
- {flow_record-3.16.dev1 → flow_record-3.16.dev3}/tests/test_json_packer.py +0 -0
- {flow_record-3.16.dev1 → flow_record-3.16.dev3}/tests/test_json_record_adapter.py +0 -0
- {flow_record-3.16.dev1 → flow_record-3.16.dev3}/tests/test_multi_timestamp.py +0 -0
- {flow_record-3.16.dev1 → flow_record-3.16.dev3}/tests/test_packer.py +0 -0
- {flow_record-3.16.dev1 → flow_record-3.16.dev3}/tests/test_rdump.py +0 -0
- {flow_record-3.16.dev1 → flow_record-3.16.dev3}/tests/test_record.py +0 -0
- {flow_record-3.16.dev1 → flow_record-3.16.dev3}/tests/test_record_adapter.py +0 -0
- {flow_record-3.16.dev1 → flow_record-3.16.dev3}/tests/test_record_descriptor.py +0 -0
- {flow_record-3.16.dev1 → flow_record-3.16.dev3}/tests/test_regression.py +0 -0
- {flow_record-3.16.dev1 → flow_record-3.16.dev3}/tests/test_selector.py +0 -0
- {flow_record-3.16.dev1 → flow_record-3.16.dev3}/tests/test_splunk_adapter.py +0 -0
- {flow_record-3.16.dev1 → flow_record-3.16.dev3}/tests/test_sqlite_duckdb_adapter.py +0 -0
- {flow_record-3.16.dev1 → flow_record-3.16.dev3}/tests/utils_inspect.py +0 -0
- {flow_record-3.16.dev1 → flow_record-3.16.dev3}/tox.ini +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: flow.record
|
|
3
|
-
Version: 3.16.
|
|
3
|
+
Version: 3.16.dev3
|
|
4
4
|
Summary: A library for defining and creating structured data (called records) that can be streamed to disk or piped to other tools that use flow.record
|
|
5
5
|
Author-email: Dissect Team <dissect@fox-it.com>
|
|
6
6
|
License: Affero General Public License v3
|
|
@@ -31,6 +31,7 @@ from urllib.parse import parse_qsl, urlparse
|
|
|
31
31
|
|
|
32
32
|
from flow.record.adapter import AbstractReader, AbstractWriter
|
|
33
33
|
from flow.record.exceptions import RecordAdapterNotFound, RecordDescriptorError
|
|
34
|
+
from flow.record.utils import get_stdin, get_stdout
|
|
34
35
|
|
|
35
36
|
try:
|
|
36
37
|
import lz4.frame as lz4
|
|
@@ -812,10 +813,7 @@ def open_path(path: str, mode: str, clobber: bool = True) -> IO:
|
|
|
812
813
|
# normal file or stdio for reading or writing
|
|
813
814
|
if not fp:
|
|
814
815
|
if is_stdio:
|
|
815
|
-
if binary
|
|
816
|
-
fp = getattr(sys.stdout, "buffer", sys.stdout) if out else getattr(sys.stdin, "buffer", sys.stdin)
|
|
817
|
-
else:
|
|
818
|
-
fp = sys.stdout if out else sys.stdin
|
|
816
|
+
fp = get_stdout(binary=binary) if out else get_stdin(binary=binary)
|
|
819
817
|
else:
|
|
820
818
|
fp = io.open(path, mode)
|
|
821
819
|
# check if we are reading a compressed stream
|
|
@@ -867,7 +865,7 @@ def RecordAdapter(
|
|
|
867
865
|
if url in ("-", "", None) and fileobj is None:
|
|
868
866
|
# For reading stdin, we cannot rely on an extension to know what sort of stream is incoming. Thus, we will
|
|
869
867
|
# treat it as a 'fileobj', where we can peek into the stream and try to select the appropriate adapter.
|
|
870
|
-
fileobj =
|
|
868
|
+
fileobj = get_stdin(binary=True)
|
|
871
869
|
if fileobj is not None:
|
|
872
870
|
# This record adapter has received a file-like object for record reading
|
|
873
871
|
# We just need to find the right adapter by peeking into the first few bytes.
|
|
@@ -663,7 +663,7 @@ class path(pathlib.PurePath, FieldType):
|
|
|
663
663
|
#
|
|
664
664
|
# This construction works around that by converting all path parts
|
|
665
665
|
# to strings first.
|
|
666
|
-
args = (str(arg) for arg in args)
|
|
666
|
+
args = tuple(str(arg) for arg in args)
|
|
667
667
|
elif isinstance(path_part, pathlib.PurePosixPath):
|
|
668
668
|
cls = posix_path
|
|
669
669
|
elif _is_windowslike_path(path_part):
|
|
@@ -671,7 +671,7 @@ class path(pathlib.PurePath, FieldType):
|
|
|
671
671
|
# like path separator (\).
|
|
672
672
|
cls = windows_path
|
|
673
673
|
if not PY_312:
|
|
674
|
-
args = (str(arg) for arg in args)
|
|
674
|
+
args = tuple(str(arg) for arg in args)
|
|
675
675
|
elif _is_posixlike_path(path_part):
|
|
676
676
|
# This handles any custom PurePath based implementations that don't have a
|
|
677
677
|
# windows like path separator (\).
|
|
@@ -684,13 +684,24 @@ class path(pathlib.PurePath, FieldType):
|
|
|
684
684
|
obj = super().__new__(cls)
|
|
685
685
|
else:
|
|
686
686
|
obj = cls._from_parts(args)
|
|
687
|
+
|
|
688
|
+
obj._empty_path = False
|
|
689
|
+
if not args or args == ("",):
|
|
690
|
+
obj._empty_path = True
|
|
687
691
|
return obj
|
|
688
692
|
|
|
689
693
|
def __eq__(self, other: Any) -> bool:
|
|
690
694
|
if isinstance(other, str):
|
|
691
695
|
return str(self) == other or self == self.__class__(other)
|
|
696
|
+
if self._empty_path:
|
|
697
|
+
return isinstance(other, self.__class__) and other._empty_path
|
|
692
698
|
return super().__eq__(other)
|
|
693
699
|
|
|
700
|
+
def __str__(self) -> str:
|
|
701
|
+
if self._empty_path:
|
|
702
|
+
return ""
|
|
703
|
+
return super().__str__()
|
|
704
|
+
|
|
694
705
|
def __repr__(self) -> str:
|
|
695
706
|
return repr(str(self))
|
|
696
707
|
|
|
@@ -12,6 +12,7 @@ from functools import lru_cache
|
|
|
12
12
|
from flow.record import RECORDSTREAM_MAGIC, RecordWriter
|
|
13
13
|
from flow.record.fieldtypes import fieldtype_for_value
|
|
14
14
|
from flow.record.selector import make_selector
|
|
15
|
+
from flow.record.utils import is_stdout
|
|
15
16
|
|
|
16
17
|
from .base import RecordDescriptor, RecordReader
|
|
17
18
|
from .packer import RecordPacker
|
|
@@ -70,7 +71,7 @@ class RecordStreamWriter:
|
|
|
70
71
|
self.write(descriptor)
|
|
71
72
|
|
|
72
73
|
def close(self):
|
|
73
|
-
if self.fp and self.fp
|
|
74
|
+
if self.fp and not is_stdout(self.fp):
|
|
74
75
|
self.fp.close()
|
|
75
76
|
self.fp = None
|
|
76
77
|
|
|
@@ -1,15 +1,51 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
1
3
|
import base64
|
|
2
4
|
import os
|
|
3
5
|
import sys
|
|
4
6
|
from functools import wraps
|
|
7
|
+
from typing import BinaryIO, TextIO
|
|
5
8
|
|
|
6
9
|
_native = str
|
|
7
10
|
_unicode = type("")
|
|
8
11
|
_bytes = type(b"")
|
|
9
12
|
|
|
10
13
|
|
|
11
|
-
def
|
|
12
|
-
|
|
14
|
+
def get_stdout(binary: bool = False) -> TextIO | BinaryIO:
|
|
15
|
+
"""Return the stdout stream as binary or text stream.
|
|
16
|
+
|
|
17
|
+
This function is the preferred way to get the stdout stream in flow.record.
|
|
18
|
+
|
|
19
|
+
Arguments:
|
|
20
|
+
binary: Whether to return the stream as binary stream.
|
|
21
|
+
|
|
22
|
+
Returns:
|
|
23
|
+
The stdout stream.
|
|
24
|
+
"""
|
|
25
|
+
fp = getattr(sys.stdout, "buffer", sys.stdout) if binary else sys.stdout
|
|
26
|
+
fp._is_stdout = True
|
|
27
|
+
return fp
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
def get_stdin(binary: bool = False) -> TextIO | BinaryIO:
|
|
31
|
+
"""Return the stdin stream as binary or text stream.
|
|
32
|
+
|
|
33
|
+
This function is the preferred way to get the stdin stream in flow.record.
|
|
34
|
+
|
|
35
|
+
Arguments:
|
|
36
|
+
binary: Whether to return the stream as binary stream.
|
|
37
|
+
|
|
38
|
+
Returns:
|
|
39
|
+
The stdin stream.
|
|
40
|
+
"""
|
|
41
|
+
fp = getattr(sys.stdin, "buffer", sys.stdin) if binary else sys.stdin
|
|
42
|
+
fp._is_stdin = True
|
|
43
|
+
return fp
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def is_stdout(fp: TextIO | BinaryIO) -> bool:
|
|
47
|
+
"""Returns True if ``fp`` is the stdout stream."""
|
|
48
|
+
return fp in (sys.stdout, sys.stdout.buffer) or hasattr(fp, "_is_stdout")
|
|
13
49
|
|
|
14
50
|
|
|
15
51
|
def to_bytes(value):
|
|
@@ -12,5 +12,5 @@ __version__: str
|
|
|
12
12
|
__version_tuple__: VERSION_TUPLE
|
|
13
13
|
version_tuple: VERSION_TUPLE
|
|
14
14
|
|
|
15
|
-
__version__ = version = '3.16.
|
|
16
|
-
__version_tuple__ = version_tuple = (3, 16, '
|
|
15
|
+
__version__ = version = '3.16.dev3'
|
|
16
|
+
__version_tuple__ = version_tuple = (3, 16, 'dev3')
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: flow.record
|
|
3
|
-
Version: 3.16.
|
|
3
|
+
Version: 3.16.dev3
|
|
4
4
|
Summary: A library for defining and creating structured data (called records) that can be streamed to disk or piped to other tools that use flow.record
|
|
5
5
|
Author-email: Dissect Team <dissect@fox-it.com>
|
|
6
6
|
License: Affero General Public License v3
|
|
@@ -11,7 +11,7 @@ from datetime import datetime, timedelta, timezone
|
|
|
11
11
|
import pytest
|
|
12
12
|
|
|
13
13
|
import flow.record.fieldtypes
|
|
14
|
-
from flow.record import RecordDescriptor, RecordReader, RecordWriter
|
|
14
|
+
from flow.record import RecordDescriptor, RecordReader, RecordWriter, fieldtypes
|
|
15
15
|
from flow.record.fieldtypes import (
|
|
16
16
|
PY_312,
|
|
17
17
|
TYPE_POSIX,
|
|
@@ -617,8 +617,8 @@ def test_path():
|
|
|
617
617
|
assert r.value is None
|
|
618
618
|
|
|
619
619
|
r = TestRecord("")
|
|
620
|
-
assert str(r.value) == "
|
|
621
|
-
assert r.value == "
|
|
620
|
+
assert str(r.value) == ""
|
|
621
|
+
assert r.value == ""
|
|
622
622
|
|
|
623
623
|
if os.name == "nt":
|
|
624
624
|
native_path_str = windows_path_str
|
|
@@ -1132,5 +1132,79 @@ def test_command_failed() -> None:
|
|
|
1132
1132
|
command(b"failed")
|
|
1133
1133
|
|
|
1134
1134
|
|
|
1135
|
+
@pytest.mark.parametrize(
|
|
1136
|
+
"path_cls",
|
|
1137
|
+
[
|
|
1138
|
+
fieldtypes.posix_path,
|
|
1139
|
+
fieldtypes.windows_path,
|
|
1140
|
+
fieldtypes.path,
|
|
1141
|
+
],
|
|
1142
|
+
)
|
|
1143
|
+
def test_empty_path(path_cls) -> None:
|
|
1144
|
+
# initialize with empty string
|
|
1145
|
+
p1 = path_cls("")
|
|
1146
|
+
assert p1 == ""
|
|
1147
|
+
assert p1._empty_path
|
|
1148
|
+
assert str(p1) == ""
|
|
1149
|
+
assert p1 != path_cls(".")
|
|
1150
|
+
|
|
1151
|
+
# initialize without any arguments
|
|
1152
|
+
p2 = path_cls()
|
|
1153
|
+
assert p2 == ""
|
|
1154
|
+
assert p2._empty_path
|
|
1155
|
+
assert str(p2) == ""
|
|
1156
|
+
assert p2 != path_cls(".")
|
|
1157
|
+
|
|
1158
|
+
assert p1 == p2
|
|
1159
|
+
|
|
1160
|
+
|
|
1161
|
+
def test_empty_path_different_types() -> None:
|
|
1162
|
+
assert fieldtypes.posix_path("") != fieldtypes.windows_path("")
|
|
1163
|
+
|
|
1164
|
+
|
|
1165
|
+
def test_record_empty_path() -> None:
|
|
1166
|
+
TestRecord = RecordDescriptor(
|
|
1167
|
+
"test/path",
|
|
1168
|
+
[
|
|
1169
|
+
("path", "value"),
|
|
1170
|
+
],
|
|
1171
|
+
)
|
|
1172
|
+
|
|
1173
|
+
r = TestRecord()
|
|
1174
|
+
assert r.value is None
|
|
1175
|
+
assert repr(r) == "<test/path value=None>"
|
|
1176
|
+
|
|
1177
|
+
r = TestRecord("")
|
|
1178
|
+
assert r.value == ""
|
|
1179
|
+
assert repr(r) == "<test/path value=''>"
|
|
1180
|
+
|
|
1181
|
+
|
|
1182
|
+
def test_empty_path_serialization(tmp_path) -> None:
|
|
1183
|
+
TestRecord = RecordDescriptor(
|
|
1184
|
+
"test/path",
|
|
1185
|
+
[
|
|
1186
|
+
("path", "value"),
|
|
1187
|
+
],
|
|
1188
|
+
)
|
|
1189
|
+
|
|
1190
|
+
# Test path value=None serialization
|
|
1191
|
+
p_tmp_records = tmp_path / "none_path"
|
|
1192
|
+
with RecordWriter(p_tmp_records) as writer:
|
|
1193
|
+
record = TestRecord()
|
|
1194
|
+
writer.write(record)
|
|
1195
|
+
with RecordReader(p_tmp_records) as reader:
|
|
1196
|
+
for record in reader:
|
|
1197
|
+
assert record.value is None
|
|
1198
|
+
|
|
1199
|
+
# Test path value="" serialization
|
|
1200
|
+
p_tmp_records = tmp_path / "empty_str"
|
|
1201
|
+
with RecordWriter(p_tmp_records) as writer:
|
|
1202
|
+
record = TestRecord("")
|
|
1203
|
+
writer.write(record)
|
|
1204
|
+
with RecordReader(p_tmp_records) as reader:
|
|
1205
|
+
for record in reader:
|
|
1206
|
+
assert record.value == ""
|
|
1207
|
+
|
|
1208
|
+
|
|
1135
1209
|
if __name__ == "__main__":
|
|
1136
1210
|
__import__("standalone_test").main(globals())
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|