plain 0.10.0__tar.gz → 0.12.0__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.
- {plain-0.10.0 → plain-0.12.0}/PKG-INFO +1 -1
- {plain-0.10.0 → plain-0.12.0}/plain/http/request.py +3 -3
- {plain-0.10.0 → plain-0.12.0}/plain/preflight/__init__.py +1 -2
- plain-0.10.0/plain/preflight/security/base.py → plain-0.12.0/plain/preflight/security.py +30 -37
- {plain-0.10.0 → plain-0.12.0}/plain/runtime/global_settings.py +14 -12
- {plain-0.10.0 → plain-0.12.0}/pyproject.toml +1 -1
- plain-0.10.0/plain/preflight/security/csrf.py +0 -36
- plain-0.10.0/plain/utils/__init__.py +0 -0
- {plain-0.10.0 → plain-0.12.0}/LICENSE +0 -0
- {plain-0.10.0 → plain-0.12.0}/README.md +0 -0
- {plain-0.10.0 → plain-0.12.0}/plain/README.md +0 -0
- {plain-0.10.0 → plain-0.12.0}/plain/__main__.py +0 -0
- {plain-0.10.0 → plain-0.12.0}/plain/assets/README.md +0 -0
- {plain-0.10.0 → plain-0.12.0}/plain/assets/__init__.py +0 -0
- {plain-0.10.0 → plain-0.12.0}/plain/assets/compile.py +0 -0
- {plain-0.10.0 → plain-0.12.0}/plain/assets/finders.py +0 -0
- {plain-0.10.0 → plain-0.12.0}/plain/assets/fingerprints.py +0 -0
- {plain-0.10.0 → plain-0.12.0}/plain/assets/urls.py +0 -0
- {plain-0.10.0 → plain-0.12.0}/plain/assets/views.py +0 -0
- {plain-0.10.0 → plain-0.12.0}/plain/cli/README.md +0 -0
- {plain-0.10.0 → plain-0.12.0}/plain/cli/__init__.py +0 -0
- {plain-0.10.0 → plain-0.12.0}/plain/cli/cli.py +0 -0
- {plain-0.10.0 → plain-0.12.0}/plain/cli/formatting.py +0 -0
- {plain-0.10.0 → plain-0.12.0}/plain/cli/packages.py +0 -0
- {plain-0.10.0 → plain-0.12.0}/plain/cli/print.py +0 -0
- {plain-0.10.0 → plain-0.12.0}/plain/cli/startup.py +0 -0
- {plain-0.10.0 → plain-0.12.0}/plain/csrf/README.md +0 -0
- {plain-0.10.0 → plain-0.12.0}/plain/csrf/middleware.py +0 -0
- {plain-0.10.0 → plain-0.12.0}/plain/csrf/views.py +0 -0
- {plain-0.10.0 → plain-0.12.0}/plain/debug.py +0 -0
- {plain-0.10.0 → plain-0.12.0}/plain/exceptions.py +0 -0
- {plain-0.10.0 → plain-0.12.0}/plain/forms/README.md +0 -0
- {plain-0.10.0 → plain-0.12.0}/plain/forms/__init__.py +0 -0
- {plain-0.10.0 → plain-0.12.0}/plain/forms/boundfield.py +0 -0
- {plain-0.10.0 → plain-0.12.0}/plain/forms/exceptions.py +0 -0
- {plain-0.10.0 → plain-0.12.0}/plain/forms/fields.py +0 -0
- {plain-0.10.0 → plain-0.12.0}/plain/forms/forms.py +0 -0
- {plain-0.10.0 → plain-0.12.0}/plain/http/README.md +0 -0
- {plain-0.10.0 → plain-0.12.0}/plain/http/__init__.py +0 -0
- {plain-0.10.0 → plain-0.12.0}/plain/http/cookie.py +0 -0
- {plain-0.10.0 → plain-0.12.0}/plain/http/multipartparser.py +0 -0
- {plain-0.10.0 → plain-0.12.0}/plain/http/response.py +0 -0
- {plain-0.10.0 → plain-0.12.0}/plain/internal/__init__.py +0 -0
- {plain-0.10.0 → plain-0.12.0}/plain/internal/files/README.md +0 -0
- {plain-0.10.0 → plain-0.12.0}/plain/internal/files/__init__.py +0 -0
- {plain-0.10.0 → plain-0.12.0}/plain/internal/files/base.py +0 -0
- {plain-0.10.0 → plain-0.12.0}/plain/internal/files/locks.py +0 -0
- {plain-0.10.0 → plain-0.12.0}/plain/internal/files/move.py +0 -0
- {plain-0.10.0 → plain-0.12.0}/plain/internal/files/temp.py +0 -0
- {plain-0.10.0 → plain-0.12.0}/plain/internal/files/uploadedfile.py +0 -0
- {plain-0.10.0 → plain-0.12.0}/plain/internal/files/uploadhandler.py +0 -0
- {plain-0.10.0 → plain-0.12.0}/plain/internal/files/utils.py +0 -0
- {plain-0.10.0 → plain-0.12.0}/plain/internal/handlers/__init__.py +0 -0
- {plain-0.10.0 → plain-0.12.0}/plain/internal/handlers/base.py +0 -0
- {plain-0.10.0 → plain-0.12.0}/plain/internal/handlers/exception.py +0 -0
- {plain-0.10.0 → plain-0.12.0}/plain/internal/handlers/wsgi.py +0 -0
- {plain-0.10.0 → plain-0.12.0}/plain/internal/middleware/__init__.py +0 -0
- {plain-0.10.0 → plain-0.12.0}/plain/internal/middleware/headers.py +0 -0
- {plain-0.10.0 → plain-0.12.0}/plain/internal/middleware/https.py +0 -0
- {plain-0.10.0 → plain-0.12.0}/plain/internal/middleware/slash.py +0 -0
- {plain-0.10.0 → plain-0.12.0}/plain/json.py +0 -0
- {plain-0.10.0 → plain-0.12.0}/plain/logs/README.md +0 -0
- {plain-0.10.0 → plain-0.12.0}/plain/logs/__init__.py +0 -0
- {plain-0.10.0 → plain-0.12.0}/plain/logs/configure.py +0 -0
- {plain-0.10.0 → plain-0.12.0}/plain/logs/loggers.py +0 -0
- {plain-0.10.0 → plain-0.12.0}/plain/logs/utils.py +0 -0
- {plain-0.10.0 → plain-0.12.0}/plain/packages/README.md +0 -0
- {plain-0.10.0 → plain-0.12.0}/plain/packages/__init__.py +0 -0
- {plain-0.10.0 → plain-0.12.0}/plain/packages/config.py +0 -0
- {plain-0.10.0 → plain-0.12.0}/plain/packages/registry.py +0 -0
- {plain-0.10.0 → plain-0.12.0}/plain/paginator.py +0 -0
- {plain-0.10.0 → plain-0.12.0}/plain/preflight/README.md +0 -0
- {plain-0.10.0 → plain-0.12.0}/plain/preflight/files.py +0 -0
- {plain-0.10.0 → plain-0.12.0}/plain/preflight/messages.py +0 -0
- {plain-0.10.0 → plain-0.12.0}/plain/preflight/registry.py +0 -0
- {plain-0.10.0 → plain-0.12.0}/plain/preflight/urls.py +0 -0
- {plain-0.10.0 → plain-0.12.0}/plain/runtime/README.md +0 -0
- {plain-0.10.0 → plain-0.12.0}/plain/runtime/__init__.py +0 -0
- {plain-0.10.0 → plain-0.12.0}/plain/runtime/user_settings.py +0 -0
- {plain-0.10.0 → plain-0.12.0}/plain/signals/README.md +0 -0
- {plain-0.10.0 → plain-0.12.0}/plain/signals/__init__.py +0 -0
- {plain-0.10.0 → plain-0.12.0}/plain/signals/dispatch/__init__.py +0 -0
- {plain-0.10.0 → plain-0.12.0}/plain/signals/dispatch/dispatcher.py +0 -0
- {plain-0.10.0 → plain-0.12.0}/plain/signals/dispatch/license.txt +0 -0
- {plain-0.10.0 → plain-0.12.0}/plain/signing.py +0 -0
- {plain-0.10.0 → plain-0.12.0}/plain/templates/README.md +0 -0
- {plain-0.10.0 → plain-0.12.0}/plain/templates/__init__.py +0 -0
- {plain-0.10.0 → plain-0.12.0}/plain/templates/core.py +0 -0
- {plain-0.10.0 → plain-0.12.0}/plain/templates/jinja/README.md +0 -0
- {plain-0.10.0 → plain-0.12.0}/plain/templates/jinja/__init__.py +0 -0
- {plain-0.10.0 → plain-0.12.0}/plain/templates/jinja/defaults.py +0 -0
- {plain-0.10.0 → plain-0.12.0}/plain/templates/jinja/extensions.py +0 -0
- {plain-0.10.0 → plain-0.12.0}/plain/templates/jinja/filters.py +0 -0
- {plain-0.10.0 → plain-0.12.0}/plain/templates/jinja/globals.py +0 -0
- {plain-0.10.0 → plain-0.12.0}/plain/test/README.md +0 -0
- {plain-0.10.0 → plain-0.12.0}/plain/test/__init__.py +0 -0
- {plain-0.10.0 → plain-0.12.0}/plain/test/client.py +0 -0
- {plain-0.10.0 → plain-0.12.0}/plain/urls/README.md +0 -0
- {plain-0.10.0 → plain-0.12.0}/plain/urls/__init__.py +0 -0
- {plain-0.10.0 → plain-0.12.0}/plain/urls/base.py +0 -0
- {plain-0.10.0 → plain-0.12.0}/plain/urls/conf.py +0 -0
- {plain-0.10.0 → plain-0.12.0}/plain/urls/converters.py +0 -0
- {plain-0.10.0 → plain-0.12.0}/plain/urls/exceptions.py +0 -0
- {plain-0.10.0 → plain-0.12.0}/plain/urls/resolvers.py +0 -0
- {plain-0.10.0 → plain-0.12.0}/plain/utils/README.md +0 -0
- {plain-0.10.0/plain/preflight/security → plain-0.12.0/plain/utils}/__init__.py +0 -0
- {plain-0.10.0 → plain-0.12.0}/plain/utils/_os.py +0 -0
- {plain-0.10.0 → plain-0.12.0}/plain/utils/cache.py +0 -0
- {plain-0.10.0 → plain-0.12.0}/plain/utils/connection.py +0 -0
- {plain-0.10.0 → plain-0.12.0}/plain/utils/crypto.py +0 -0
- {plain-0.10.0 → plain-0.12.0}/plain/utils/datastructures.py +0 -0
- {plain-0.10.0 → plain-0.12.0}/plain/utils/dateformat.py +0 -0
- {plain-0.10.0 → plain-0.12.0}/plain/utils/dateparse.py +0 -0
- {plain-0.10.0 → plain-0.12.0}/plain/utils/dates.py +0 -0
- {plain-0.10.0 → plain-0.12.0}/plain/utils/deconstruct.py +0 -0
- {plain-0.10.0 → plain-0.12.0}/plain/utils/decorators.py +0 -0
- {plain-0.10.0 → plain-0.12.0}/plain/utils/deprecation.py +0 -0
- {plain-0.10.0 → plain-0.12.0}/plain/utils/duration.py +0 -0
- {plain-0.10.0 → plain-0.12.0}/plain/utils/email.py +0 -0
- {plain-0.10.0 → plain-0.12.0}/plain/utils/encoding.py +0 -0
- {plain-0.10.0 → plain-0.12.0}/plain/utils/functional.py +0 -0
- {plain-0.10.0 → plain-0.12.0}/plain/utils/hashable.py +0 -0
- {plain-0.10.0 → plain-0.12.0}/plain/utils/html.py +0 -0
- {plain-0.10.0 → plain-0.12.0}/plain/utils/http.py +0 -0
- {plain-0.10.0 → plain-0.12.0}/plain/utils/inspect.py +0 -0
- {plain-0.10.0 → plain-0.12.0}/plain/utils/ipv6.py +0 -0
- {plain-0.10.0 → plain-0.12.0}/plain/utils/itercompat.py +0 -0
- {plain-0.10.0 → plain-0.12.0}/plain/utils/module_loading.py +0 -0
- {plain-0.10.0 → plain-0.12.0}/plain/utils/regex_helper.py +0 -0
- {plain-0.10.0 → plain-0.12.0}/plain/utils/safestring.py +0 -0
- {plain-0.10.0 → plain-0.12.0}/plain/utils/termcolors.py +0 -0
- {plain-0.10.0 → plain-0.12.0}/plain/utils/text.py +0 -0
- {plain-0.10.0 → plain-0.12.0}/plain/utils/timesince.py +0 -0
- {plain-0.10.0 → plain-0.12.0}/plain/utils/timezone.py +0 -0
- {plain-0.10.0 → plain-0.12.0}/plain/utils/tree.py +0 -0
- {plain-0.10.0 → plain-0.12.0}/plain/validators.py +0 -0
- {plain-0.10.0 → plain-0.12.0}/plain/views/README.md +0 -0
- {plain-0.10.0 → plain-0.12.0}/plain/views/__init__.py +0 -0
- {plain-0.10.0 → plain-0.12.0}/plain/views/base.py +0 -0
- {plain-0.10.0 → plain-0.12.0}/plain/views/csrf.py +0 -0
- {plain-0.10.0 → plain-0.12.0}/plain/views/errors.py +0 -0
- {plain-0.10.0 → plain-0.12.0}/plain/views/exceptions.py +0 -0
- {plain-0.10.0 → plain-0.12.0}/plain/views/forms.py +0 -0
- {plain-0.10.0 → plain-0.12.0}/plain/views/objects.py +0 -0
- {plain-0.10.0 → plain-0.12.0}/plain/views/redirect.py +0 -0
- {plain-0.10.0 → plain-0.12.0}/plain/views/templates.py +0 -0
- {plain-0.10.0 → plain-0.12.0}/plain/wsgi.py +0 -0
@@ -267,12 +267,12 @@ class HttpRequest:
|
|
267
267
|
|
268
268
|
@property
|
269
269
|
def scheme(self):
|
270
|
-
if settings.
|
270
|
+
if settings.HTTPS_PROXY_HEADER:
|
271
271
|
try:
|
272
|
-
header, secure_value = settings.
|
272
|
+
header, secure_value = settings.HTTPS_PROXY_HEADER
|
273
273
|
except ValueError:
|
274
274
|
raise ImproperlyConfigured(
|
275
|
-
"The
|
275
|
+
"The HTTPS_PROXY_HEADER setting must be a tuple containing "
|
276
276
|
"two values."
|
277
277
|
)
|
278
278
|
header_value = self.META.get(header)
|
@@ -15,8 +15,7 @@ from .registry import register, run_checks
|
|
15
15
|
|
16
16
|
# Import these to force registration of checks
|
17
17
|
import plain.preflight.files # NOQA isort:skip
|
18
|
-
import plain.preflight.security
|
19
|
-
import plain.preflight.security.csrf # NOQA isort:skip
|
18
|
+
import plain.preflight.security # NOQA isort:skip
|
20
19
|
import plain.preflight.urls # NOQA isort:skip
|
21
20
|
|
22
21
|
|
@@ -16,40 +16,6 @@ SECRET_KEY_WARNING_MSG = (
|
|
16
16
|
f"vulnerable to attack."
|
17
17
|
)
|
18
18
|
|
19
|
-
# TODO
|
20
|
-
W001 = Warning(
|
21
|
-
"You do not have 'plain.middleware.https.HttpsRedirectMiddleware' "
|
22
|
-
"in your MIDDLEWARE so the SECURE_HSTS_SECONDS, "
|
23
|
-
"SECURE_CONTENT_TYPE_NOSNIFF, SECURE_REFERRER_POLICY, "
|
24
|
-
"SECURE_CROSS_ORIGIN_OPENER_POLICY, and HTTPS_REDIRECT_ENABLED settings will "
|
25
|
-
"have no effect.",
|
26
|
-
id="security.W001",
|
27
|
-
)
|
28
|
-
|
29
|
-
W008 = Warning(
|
30
|
-
"Your HTTPS_REDIRECT_ENABLED setting is not set to True. "
|
31
|
-
"Unless your site should be available over both SSL and non-SSL "
|
32
|
-
"connections, you may want to either set this setting True "
|
33
|
-
"or configure a load balancer or reverse-proxy server "
|
34
|
-
"to redirect all connections to HTTPS.",
|
35
|
-
id="security.W008",
|
36
|
-
)
|
37
|
-
|
38
|
-
W009 = Warning(
|
39
|
-
SECRET_KEY_WARNING_MSG % "SECRET_KEY",
|
40
|
-
id="security.W009",
|
41
|
-
)
|
42
|
-
|
43
|
-
W018 = Warning(
|
44
|
-
"You should not have DEBUG set to True in deployment.",
|
45
|
-
id="security.W018",
|
46
|
-
)
|
47
|
-
|
48
|
-
W020 = Warning(
|
49
|
-
"ALLOWED_HOSTS must not be empty in deployment.",
|
50
|
-
id="security.W020",
|
51
|
-
)
|
52
|
-
|
53
19
|
W025 = Warning(SECRET_KEY_WARNING_MSG, id="security.W025")
|
54
20
|
|
55
21
|
|
@@ -69,7 +35,16 @@ def check_secret_key(package_configs, **kwargs):
|
|
69
35
|
passed_check = False
|
70
36
|
else:
|
71
37
|
passed_check = _check_secret_key(secret_key)
|
72
|
-
return
|
38
|
+
return (
|
39
|
+
[]
|
40
|
+
if passed_check
|
41
|
+
else [
|
42
|
+
Warning(
|
43
|
+
SECRET_KEY_WARNING_MSG % "SECRET_KEY",
|
44
|
+
id="security.W009",
|
45
|
+
)
|
46
|
+
]
|
47
|
+
)
|
73
48
|
|
74
49
|
|
75
50
|
@register(deploy=True)
|
@@ -91,9 +66,27 @@ def check_secret_key_fallbacks(package_configs, **kwargs):
|
|
91
66
|
@register(deploy=True)
|
92
67
|
def check_debug(package_configs, **kwargs):
|
93
68
|
passed_check = not settings.DEBUG
|
94
|
-
return
|
69
|
+
return (
|
70
|
+
[]
|
71
|
+
if passed_check
|
72
|
+
else [
|
73
|
+
Warning(
|
74
|
+
"You should not have DEBUG set to True in deployment.",
|
75
|
+
id="security.W018",
|
76
|
+
)
|
77
|
+
]
|
78
|
+
)
|
95
79
|
|
96
80
|
|
97
81
|
@register(deploy=True)
|
98
82
|
def check_allowed_hosts(package_configs, **kwargs):
|
99
|
-
return
|
83
|
+
return (
|
84
|
+
[]
|
85
|
+
if settings.ALLOWED_HOSTS
|
86
|
+
else [
|
87
|
+
Warning(
|
88
|
+
"ALLOWED_HOSTS must not be empty in deployment.",
|
89
|
+
id="security.W020",
|
90
|
+
)
|
91
|
+
]
|
92
|
+
)
|
@@ -50,6 +50,20 @@ HTTPS_REDIRECT_ENABLED = True
|
|
50
50
|
HTTPS_REDIRECT_EXEMPT = []
|
51
51
|
HTTPS_REDIRECT_HOST = None
|
52
52
|
|
53
|
+
# If your Plain app is behind a proxy that sets a header to specify secure
|
54
|
+
# connections, AND that proxy ensures that user-submitted headers with the
|
55
|
+
# same name are ignored (so that people can't spoof it), set this value to
|
56
|
+
# a tuple of (header_name, header_value). For any requests that come in with
|
57
|
+
# that header/value, request.is_https() will return True.
|
58
|
+
# WARNING! Only set this if you fully understand what you're doing. Otherwise,
|
59
|
+
# you may be opening yourself up to a security risk.
|
60
|
+
HTTPS_PROXY_HEADER = None
|
61
|
+
|
62
|
+
# Whether to use the X-Forwarded-Host and X-Forwarded-Port headers
|
63
|
+
# when determining the host and port for the request.
|
64
|
+
USE_X_FORWARDED_HOST = False
|
65
|
+
USE_X_FORWARDED_PORT = False
|
66
|
+
|
53
67
|
# A secret key for this particular Plain installation. Used in secret-key
|
54
68
|
# hashing algorithms. Set this in your settings, or Plain will complain
|
55
69
|
# loudly.
|
@@ -88,21 +102,9 @@ DATA_UPLOAD_MAX_NUMBER_FILES = 100
|
|
88
102
|
# (i.e. "/tmp" on *nix systems).
|
89
103
|
FILE_UPLOAD_TEMP_DIR = None
|
90
104
|
|
91
|
-
USE_X_FORWARDED_HOST = False
|
92
|
-
USE_X_FORWARDED_PORT = False
|
93
|
-
|
94
105
|
# User-defined overrides for error views by status code
|
95
106
|
HTTP_ERROR_VIEWS: dict[int] = {}
|
96
107
|
|
97
|
-
# If your Plain app is behind a proxy that sets a header to specify secure
|
98
|
-
# connections, AND that proxy ensures that user-submitted headers with the
|
99
|
-
# same name are ignored (so that people can't spoof it), set this value to
|
100
|
-
# a tuple of (header_name, header_value). For any requests that come in with
|
101
|
-
# that header/value, request.is_https() will return True.
|
102
|
-
# WARNING! Only set this if you fully understand what you're doing. Otherwise,
|
103
|
-
# you may be opening yourself up to a security risk.
|
104
|
-
SECURE_PROXY_SSL_HEADER = None
|
105
|
-
|
106
108
|
##############
|
107
109
|
# MIDDLEWARE #
|
108
110
|
##############
|
@@ -1,36 +0,0 @@
|
|
1
|
-
from plain.runtime import settings
|
2
|
-
|
3
|
-
from .. import Warning, register
|
4
|
-
|
5
|
-
W003 = Warning(
|
6
|
-
"You don't appear to be using Plain's built-in "
|
7
|
-
"cross-site request forgery protection via the middleware "
|
8
|
-
"('plain.csrf.middleware.CsrfViewMiddleware' is not in your "
|
9
|
-
"MIDDLEWARE). Enabling the middleware is the safest approach "
|
10
|
-
"to ensure you don't leave any holes.",
|
11
|
-
id="security.W003",
|
12
|
-
)
|
13
|
-
|
14
|
-
W016 = Warning(
|
15
|
-
"You have 'plain.csrf.middleware.CsrfViewMiddleware' in your "
|
16
|
-
"MIDDLEWARE, but you have not set CSRF_COOKIE_SECURE to True. "
|
17
|
-
"Using a secure-only CSRF cookie makes it more difficult for network "
|
18
|
-
"traffic sniffers to steal the CSRF token.",
|
19
|
-
id="security.W016",
|
20
|
-
)
|
21
|
-
|
22
|
-
|
23
|
-
def _csrf_middleware():
|
24
|
-
return "plain.csrf.middleware.CsrfViewMiddleware" in settings.MIDDLEWARE
|
25
|
-
|
26
|
-
|
27
|
-
@register(deploy=True)
|
28
|
-
def check_csrf_middleware(package_configs, **kwargs):
|
29
|
-
passed_check = _csrf_middleware()
|
30
|
-
return [] if passed_check else [W003]
|
31
|
-
|
32
|
-
|
33
|
-
@register(deploy=True)
|
34
|
-
def check_csrf_cookie_secure(package_configs, **kwargs):
|
35
|
-
passed_check = not _csrf_middleware() or settings.CSRF_COOKIE_SECURE is True
|
36
|
-
return [] if passed_check else [W016]
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|