atomicshop 2.17.3__py3-none-any.whl → 2.18.0__py3-none-any.whl
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.
Potentially problematic release.
This version of atomicshop might be problematic. Click here for more details.
- atomicshop/__init__.py +1 -1
- atomicshop/basics/ansi_escape_codes.py +3 -1
- atomicshop/file_io/docxs.py +26 -17
- atomicshop/http_parse.py +118 -77
- atomicshop/mitm/connection_thread_worker.py +342 -257
- atomicshop/mitm/engines/__parent/parser___parent.py +2 -2
- atomicshop/mitm/engines/__parent/recorder___parent.py +83 -24
- atomicshop/mitm/engines/__reference_general/recorder___reference_general.py +2 -2
- atomicshop/mitm/message.py +40 -15
- atomicshop/mitm/mitm_main.py +3 -2
- atomicshop/mitm/recs_files.py +2 -1
- atomicshop/system_resource_monitor.py +16 -3
- atomicshop/wrappers/socketw/base.py +17 -0
- atomicshop/wrappers/socketw/receiver.py +90 -100
- atomicshop/wrappers/socketw/sender.py +5 -8
- atomicshop/wrappers/socketw/sni.py +0 -1
- atomicshop/wrappers/socketw/socket_client.py +2 -2
- atomicshop/wrappers/socketw/statistics_csv.py +12 -6
- {atomicshop-2.17.3.dist-info → atomicshop-2.18.0.dist-info}/METADATA +1 -1
- {atomicshop-2.17.3.dist-info → atomicshop-2.18.0.dist-info}/RECORD +23 -23
- {atomicshop-2.17.3.dist-info → atomicshop-2.18.0.dist-info}/LICENSE.txt +0 -0
- {atomicshop-2.17.3.dist-info → atomicshop-2.18.0.dist-info}/WHEEL +0 -0
- {atomicshop-2.17.3.dist-info → atomicshop-2.18.0.dist-info}/top_level.txt +0 -0
|
@@ -54,7 +54,6 @@ class SNISetup:
|
|
|
54
54
|
self.default_server_certificate_name = default_server_certificate_name
|
|
55
55
|
self.default_server_certificate_directory = default_server_certificate_directory
|
|
56
56
|
self.default_certificate_domain_list = default_certificate_domain_list
|
|
57
|
-
self.enable_sslkeylogfile_to_ssl_context: bool = enable_sslkeylogfile_to_ssl_context
|
|
58
57
|
self.sni_custom_callback_function: callable = sni_custom_callback_function
|
|
59
58
|
self.sni_use_default_callback_function: bool = sni_use_default_callback_function
|
|
60
59
|
self.sni_use_default_callback_function_extended: bool = sni_use_default_callback_function_extended
|
|
@@ -113,8 +113,8 @@ class SocketClient:
|
|
|
113
113
|
Function to establish connection to server
|
|
114
114
|
|
|
115
115
|
:return: Tuple with socket object and error string.
|
|
116
|
-
|
|
117
|
-
|
|
116
|
+
If connection was successful, the error string will be None.
|
|
117
|
+
If connection wasn't successful, the socket object will be None.
|
|
118
118
|
"""
|
|
119
119
|
# Check if socket to service domain exists.
|
|
120
120
|
# If not
|
|
@@ -6,8 +6,8 @@ from ..loggingw import loggingw
|
|
|
6
6
|
|
|
7
7
|
LOGGER_NAME: str = 'statistics'
|
|
8
8
|
STATISTICS_HEADER: str = (
|
|
9
|
-
'request_time_sent,thread_id,tls,protocol,host,path,command,status_code,request_size_bytes,response_size_bytes,file_path,'
|
|
10
|
-
'process_cmd,error')
|
|
9
|
+
'request_time_sent,thread_id,tls,protocol,protocol2,host,path,command,status_code,request_size_bytes,response_size_bytes,file_path,'
|
|
10
|
+
'process_cmd,action,error')
|
|
11
11
|
|
|
12
12
|
|
|
13
13
|
class StatisticsCSVWriter:
|
|
@@ -35,6 +35,7 @@ class StatisticsCSVWriter:
|
|
|
35
35
|
tls_type: str,
|
|
36
36
|
tls_version: str,
|
|
37
37
|
protocol: str,
|
|
38
|
+
protocol2: str,
|
|
38
39
|
path: str,
|
|
39
40
|
status_code: str,
|
|
40
41
|
command: str,
|
|
@@ -43,10 +44,11 @@ class StatisticsCSVWriter:
|
|
|
43
44
|
recorded_file_path: str = None,
|
|
44
45
|
process_cmd: str = None,
|
|
45
46
|
error: str = None,
|
|
46
|
-
|
|
47
|
+
action: str = None,
|
|
48
|
+
timestamp=None,
|
|
47
49
|
):
|
|
48
|
-
if not
|
|
49
|
-
|
|
50
|
+
if not timestamp:
|
|
51
|
+
timestamp = datetime.datetime.now()
|
|
50
52
|
|
|
51
53
|
if not tls_type and not tls_version:
|
|
52
54
|
tls_info = ''
|
|
@@ -54,10 +56,11 @@ class StatisticsCSVWriter:
|
|
|
54
56
|
tls_info = f'{tls_type}|{tls_version}'
|
|
55
57
|
|
|
56
58
|
escaped_line_string: str = csvs.escape_csv_line_to_string([
|
|
57
|
-
|
|
59
|
+
timestamp,
|
|
58
60
|
thread_id,
|
|
59
61
|
tls_info,
|
|
60
62
|
protocol,
|
|
63
|
+
protocol2,
|
|
61
64
|
host,
|
|
62
65
|
path,
|
|
63
66
|
command,
|
|
@@ -66,6 +69,7 @@ class StatisticsCSVWriter:
|
|
|
66
69
|
response_size_bytes,
|
|
67
70
|
recorded_file_path,
|
|
68
71
|
process_cmd,
|
|
72
|
+
action,
|
|
69
73
|
error
|
|
70
74
|
])
|
|
71
75
|
|
|
@@ -95,6 +99,7 @@ class StatisticsCSVWriter:
|
|
|
95
99
|
tls_type='',
|
|
96
100
|
tls_version='',
|
|
97
101
|
protocol='',
|
|
102
|
+
protocol2='',
|
|
98
103
|
path='',
|
|
99
104
|
status_code='',
|
|
100
105
|
command='',
|
|
@@ -102,5 +107,6 @@ class StatisticsCSVWriter:
|
|
|
102
107
|
response_size_bytes='',
|
|
103
108
|
recorded_file_path='',
|
|
104
109
|
process_cmd=process_name,
|
|
110
|
+
action='client_accept',
|
|
105
111
|
error=error_message
|
|
106
112
|
)
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
atomicshop/__init__.py,sha256=
|
|
1
|
+
atomicshop/__init__.py,sha256=_rMDmeAEfTlnh9BqKgZC0sYcOXLQPbyCSOsQYH_2pl0,123
|
|
2
2
|
atomicshop/_basics_temp.py,sha256=6cu2dd6r2dLrd1BRNcVDKTHlsHs_26Gpw8QS6v32lQ0,3699
|
|
3
3
|
atomicshop/_create_pdf_demo.py,sha256=Yi-PGZuMg0RKvQmLqVeLIZYadqEZwUm-4A9JxBl_vYA,3713
|
|
4
4
|
atomicshop/_patch_import.py,sha256=ENp55sKVJ0e6-4lBvZnpz9PQCt3Otbur7F6aXDlyje4,6334
|
|
@@ -19,7 +19,7 @@ atomicshop/functions.py,sha256=pK8hoCE9z61PtWCxQJsda7YAphrLH1wxU5x-1QJP-sY,499
|
|
|
19
19
|
atomicshop/get_process_list.py,sha256=8cxb7gKe9sl4R6H2yMi8J6oe-RkonTvCdKjRFqi-Fs4,6075
|
|
20
20
|
atomicshop/get_process_name_cmd_dll.py,sha256=CtaSp3mgxxJKCCVW8BLx6BJNx4giCklU_T7USiCEwfc,5162
|
|
21
21
|
atomicshop/hashing.py,sha256=Le8qGFyt3_wX-zGTeQShz7L2HL_b6nVv9PnawjglyHo,3474
|
|
22
|
-
atomicshop/http_parse.py,sha256=
|
|
22
|
+
atomicshop/http_parse.py,sha256=1Tna9YbOM0rE3t6i_M-klBlwd1KNSA9skA_BqKGXDFc,11861
|
|
23
23
|
atomicshop/inspect_wrapper.py,sha256=sGRVQhrJovNygHTydqJj0hxES-aB2Eg9KbIk3G31apw,11429
|
|
24
24
|
atomicshop/ip_addresses.py,sha256=Hvi4TumEFoTEpKWaq5WNF-YzcRzt24IxmNgv-Mgax1s,1190
|
|
25
25
|
atomicshop/keyboard_press.py,sha256=1W5kRtOB75fulVx-uF2yarBhW0_IzdI1k73AnvXstk0,452
|
|
@@ -37,7 +37,7 @@ atomicshop/sound.py,sha256=tHiQQbFBk7EYN3pAfGNcxfF9oNsoYnZgu9z9iq8hxQE,24352
|
|
|
37
37
|
atomicshop/speech_recognize.py,sha256=55-dIjgkpF93mvJnJuxSFuft5H5eRvGNlUj9BeIOZxk,5903
|
|
38
38
|
atomicshop/ssh_remote.py,sha256=Mxixqs2-xGy1bhbcP0LKqjxKTNPz1Gmzz8PzO8aLB4c,17345
|
|
39
39
|
atomicshop/sys_functions.py,sha256=MTBxRve5bh58SPvhX3gMiGqHlSBuI_rdNN1NnnBBWqI,906
|
|
40
|
-
atomicshop/system_resource_monitor.py,sha256=
|
|
40
|
+
atomicshop/system_resource_monitor.py,sha256=yHdBU4mAVqoVS0Nn_SM_H42i4PgsgXDaXaMxfnL5CgA,14588
|
|
41
41
|
atomicshop/system_resources.py,sha256=iKUvVSaXR47inmr3cTYsgNfclT38dRia2oupnlhIpK4,9290
|
|
42
42
|
atomicshop/tempfiles.py,sha256=uq1ve2WlWehZ3NOTXJnpBBMt6HyCdBufqedF0HyzA6k,2517
|
|
43
43
|
atomicshop/timer.py,sha256=7Zw1KRV0acHCRATMnanyX2MLBb63Hc-6us3rCZ9dNlY,2345
|
|
@@ -83,7 +83,7 @@ atomicshop/archiver/sevenzs.py,sha256=5i_C50-deC1Cz_GQdMGofV2jeMPbbGWAvih-QnA72c
|
|
|
83
83
|
atomicshop/archiver/shutils.py,sha256=BomnK7zT-nQXA1z0i2R2aTv8eu88wPx7tf2HtOdbmEc,1280
|
|
84
84
|
atomicshop/archiver/zips.py,sha256=0Z_1MWs7YRiCBVpyaG8llnzRguHSO4R51KDMN3FJZt8,16984
|
|
85
85
|
atomicshop/basics/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
86
|
-
atomicshop/basics/ansi_escape_codes.py,sha256=
|
|
86
|
+
atomicshop/basics/ansi_escape_codes.py,sha256=uGVRW01v2O052701sOfAdCaM_GLF_cu_jrssuYiPbzA,3216
|
|
87
87
|
atomicshop/basics/argparse_template.py,sha256=horwgSf3MX1ZgRnYxtmmQuz9OU_vKrKggF65gmjlmfg,5836
|
|
88
88
|
atomicshop/basics/booleans.py,sha256=V36NaMf8AffhCom_ovQeOZlYcdtGyIcQwWKki6h7O0M,1745
|
|
89
89
|
atomicshop/basics/bytes_arrays.py,sha256=tU7KF0UAFSErGNcan4Uz1GJxeIYVRuUu9sHVZHgyNnw,6542
|
|
@@ -118,7 +118,7 @@ atomicshop/etws/traces/trace_dns.py,sha256=WvOZm7KNdP4r6ofkZhUGi9WjtYlkV3mUp_yxi
|
|
|
118
118
|
atomicshop/etws/traces/trace_sysmon_process_creation.py,sha256=OM-bkK38uYMwWLZKNOTDa0Xdk3sO6sqsxoMUIiPvm5g,4656
|
|
119
119
|
atomicshop/file_io/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
120
120
|
atomicshop/file_io/csvs.py,sha256=jBdm3_z5cMyvxLxJnGcybUAptHAbyL0r0tlLqY0sdTQ,9327
|
|
121
|
-
atomicshop/file_io/docxs.py,sha256=
|
|
121
|
+
atomicshop/file_io/docxs.py,sha256=Nyt3hSpzwqUKZEP5p5efqNpjFs9XqkK40Kp7BbbPo7E,6245
|
|
122
122
|
atomicshop/file_io/file_io.py,sha256=5Kl0P6vF4GQVdwew1lzHLb-db9qiMvDjTgccbi5P-zk,7167
|
|
123
123
|
atomicshop/file_io/jsons.py,sha256=q9ZU8slBKnHLrtn3TnbK1qxrRpj5ZvCm6AlsFzoANjo,5303
|
|
124
124
|
atomicshop/file_io/tomls.py,sha256=ol8EvQPf9sryTmZUf1v55BYSUQ6ml7HVVBHpNKbsIlA,9768
|
|
@@ -127,24 +127,24 @@ atomicshop/file_io/xmls.py,sha256=zh3SuK-dNaFq2NDNhx6ivcf4GYCfGM8M10PcEwDSpxk,21
|
|
|
127
127
|
atomicshop/mitm/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
128
128
|
atomicshop/mitm/config_static.py,sha256=r6M4FJVBr9jGIXmjcOk2KBHvCPelWcbZCQrRh3-G26k,7871
|
|
129
129
|
atomicshop/mitm/config_toml_editor.py,sha256=2p1CMcktWRR_NW-SmyDwylu63ad5e0-w1QPMa8ZLDBw,1635
|
|
130
|
-
atomicshop/mitm/connection_thread_worker.py,sha256=
|
|
130
|
+
atomicshop/mitm/connection_thread_worker.py,sha256=78QurvuN4a-_Z9q8Fydny5CkMlfz1jIF_XAaB4BiiIA,24227
|
|
131
131
|
atomicshop/mitm/import_config.py,sha256=0Ij14aISTllTOiWYJpIUMOWobQqGofD6uafui5uWllE,9272
|
|
132
132
|
atomicshop/mitm/initialize_engines.py,sha256=NWz0yBErSrYBn0xWkJDBcHStBJ-kcsv9VtorcSP9x5M,8258
|
|
133
|
-
atomicshop/mitm/message.py,sha256=
|
|
134
|
-
atomicshop/mitm/mitm_main.py,sha256=
|
|
135
|
-
atomicshop/mitm/recs_files.py,sha256=
|
|
133
|
+
atomicshop/mitm/message.py,sha256=lseej719nJeCKt2eGxyJCH8cYYEXBUm_RwkunBhloKE,2918
|
|
134
|
+
atomicshop/mitm/mitm_main.py,sha256=AxmqUiDHgfzqmIF8v2GZxlEKth6_AMaYcqAxziWMG0U,23430
|
|
135
|
+
atomicshop/mitm/recs_files.py,sha256=ZAAD0twun-FtmbSniXe3XQhIlawvANNB_HxwbHj7kwI,3151
|
|
136
136
|
atomicshop/mitm/shared_functions.py,sha256=0lzeyINd44sVEfFbahJxQmz6KAMWbYrW5ou3UYfItvw,1777
|
|
137
137
|
atomicshop/mitm/statistic_analyzer.py,sha256=5_sAYGX2Xunzo_pS2W5WijNCwr_BlGJbbOO462y_wN4,27533
|
|
138
138
|
atomicshop/mitm/engines/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
139
139
|
atomicshop/mitm/engines/create_module_template.py,sha256=TAzsA4eLD2wYr7auuL4Nf_71iXqn-BOBXlSkNVrnYD4,5336
|
|
140
140
|
atomicshop/mitm/engines/create_module_template_example.py,sha256=X5xhvbV6-g9jU_bQVhf_crZmaH50LRWz3bS-faQ18ds,489
|
|
141
141
|
atomicshop/mitm/engines/__parent/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
142
|
-
atomicshop/mitm/engines/__parent/parser___parent.py,sha256=
|
|
143
|
-
atomicshop/mitm/engines/__parent/recorder___parent.py,sha256=
|
|
142
|
+
atomicshop/mitm/engines/__parent/parser___parent.py,sha256=HHaCXhScl3OlPjz6eUxsDpJaZyk6BNuDMc9xCkeo2Ws,661
|
|
143
|
+
atomicshop/mitm/engines/__parent/recorder___parent.py,sha256=exfElkgOU57hupV6opRCeYPHw91GIkIZL6UY3f2OClM,5635
|
|
144
144
|
atomicshop/mitm/engines/__parent/responder___parent.py,sha256=7WQeR3UmMnN74bDwn-0nz2OfhXJ3-ClXpNGUFZ7wJUE,12004
|
|
145
145
|
atomicshop/mitm/engines/__reference_general/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
146
146
|
atomicshop/mitm/engines/__reference_general/parser___reference_general.py,sha256=57MEPZMAjTO6xBDZ-yt6lgGJyqRrP0Do5Gk_cgCiPns,2998
|
|
147
|
-
atomicshop/mitm/engines/__reference_general/recorder___reference_general.py,sha256=
|
|
147
|
+
atomicshop/mitm/engines/__reference_general/recorder___reference_general.py,sha256=El2_YHLoHUCiKfkAmGlXxtFpmSjsUFdsb8I1MvSAFaM,653
|
|
148
148
|
atomicshop/mitm/engines/__reference_general/responder___reference_general.py,sha256=IUyQYMPeEhIARfALWiKPFeXagSQD6lRzAxUdi4ZIT88,7010
|
|
149
149
|
atomicshop/mitm/statistic_analyzer_helper/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
150
150
|
atomicshop/mitm/statistic_analyzer_helper/analyzer_helper.py,sha256=pk6L1t1ea1kvlBoR9QEJptOmaX-mumhwLsP2GCKukbk,5920
|
|
@@ -303,24 +303,24 @@ atomicshop/wrappers/pywin32w/wmis/win32networkadapter.py,sha256=9H9MdS__GDBMm8H-
|
|
|
303
303
|
atomicshop/wrappers/pywin32w/wmis/win32process.py,sha256=qMzXtJ5hBZ5ydAyqpDbSx0nO2RJQL95HdmV5SzNKMhk,6826
|
|
304
304
|
atomicshop/wrappers/socketw/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
305
305
|
atomicshop/wrappers/socketw/accepter.py,sha256=hZZKVYlF3LOHQJsSIEKXZUf6QXXWm-AtqXZevvaYigE,1732
|
|
306
|
-
atomicshop/wrappers/socketw/base.py,sha256=
|
|
306
|
+
atomicshop/wrappers/socketw/base.py,sha256=zYwFxiEzTcItFi1RZQCMxMTLBvECVUiKwivPYKcu44g,2713
|
|
307
307
|
atomicshop/wrappers/socketw/certificator.py,sha256=mtWPJ_ew3OSwt0-1W4jaoco1VIY4NRCrMv3mDUxb_Cc,12418
|
|
308
308
|
atomicshop/wrappers/socketw/creator.py,sha256=zMWLsOF07vX-xQZR720LeHQVndUT8q-ytdCrKF5tt9I,12835
|
|
309
309
|
atomicshop/wrappers/socketw/dns_server.py,sha256=RklzINNuoMQn4PGGQEI5hiAldprbVwwvikY6u9X-jTY,49067
|
|
310
310
|
atomicshop/wrappers/socketw/exception_wrapper.py,sha256=B-X5SHLSUIWToihH2MKnOB1F4A81_X0DpLLfnYKYbEc,7067
|
|
311
311
|
atomicshop/wrappers/socketw/get_process.py,sha256=aJC-_qFUv3NgWCSUzDI72E4z8_-VTZE9NVZ0CwUoNlM,5698
|
|
312
|
-
atomicshop/wrappers/socketw/receiver.py,sha256
|
|
313
|
-
atomicshop/wrappers/socketw/sender.py,sha256=
|
|
314
|
-
atomicshop/wrappers/socketw/sni.py,sha256=
|
|
315
|
-
atomicshop/wrappers/socketw/socket_client.py,sha256=
|
|
312
|
+
atomicshop/wrappers/socketw/receiver.py,sha256=LRQO-RIY0ZRjSMGVHLVJAXFTVO1zvjgIKSefEngPFfc,8186
|
|
313
|
+
atomicshop/wrappers/socketw/sender.py,sha256=aX_K8l_rHjd5AWb8bi5mt8-YTkMYVRDB6DnPqK_XDUE,4754
|
|
314
|
+
atomicshop/wrappers/socketw/sni.py,sha256=Nc8WMZZR21o5GXILQLVWbf7OzNPXAfE8trJY153e9Qk,17591
|
|
315
|
+
atomicshop/wrappers/socketw/socket_client.py,sha256=oa3GwS4OPgokrJE5_Oc4-5_wlXHxSH9J5f2DKebms8k,22035
|
|
316
316
|
atomicshop/wrappers/socketw/socket_server_tester.py,sha256=Qobmh4XV8ZxLUaw-eW4ESKAbeSLecCKn2OWFzMhadk0,6420
|
|
317
317
|
atomicshop/wrappers/socketw/socket_wrapper.py,sha256=WtylpezgIIBuz-A6PfM0hO1sm9Exd4j3qhDXcFc74-E,35567
|
|
318
318
|
atomicshop/wrappers/socketw/ssl_base.py,sha256=kmiif84kMhBr5yjQW17p935sfjR5JKG0LxIwBA4iVvU,2275
|
|
319
|
-
atomicshop/wrappers/socketw/statistics_csv.py,sha256=
|
|
319
|
+
atomicshop/wrappers/socketw/statistics_csv.py,sha256=NvN4i7TxTe1kaOYGlIFkSMtrDXuqKlVngc5JIcNkDOg,3305
|
|
320
320
|
atomicshop/wrappers/winregw/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
321
321
|
atomicshop/wrappers/winregw/winreg_network.py,sha256=zZQfps-CdODQaTUADbHAwKHr5RUg7BLafnKWBbKaLN4,8728
|
|
322
|
-
atomicshop-2.
|
|
323
|
-
atomicshop-2.
|
|
324
|
-
atomicshop-2.
|
|
325
|
-
atomicshop-2.
|
|
326
|
-
atomicshop-2.
|
|
322
|
+
atomicshop-2.18.0.dist-info/LICENSE.txt,sha256=lLU7EYycfYcK2NR_1gfnhnRC8b8ccOTElACYplgZN88,1094
|
|
323
|
+
atomicshop-2.18.0.dist-info/METADATA,sha256=HR1ivCy6rJMstJDq387Vn9-7DrnIHJ-i4CjK1qD_obs,10499
|
|
324
|
+
atomicshop-2.18.0.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
|
|
325
|
+
atomicshop-2.18.0.dist-info/top_level.txt,sha256=EgKJB-7xcrAPeqTRF2laD_Np2gNGYkJkd4OyXqpJphA,11
|
|
326
|
+
atomicshop-2.18.0.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|