stoobly-agent 0.33.3__py3-none-any.whl → 0.33.4__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.
- stoobly_agent/__init__.py +1 -1
- stoobly_agent/app/api/requests_controller.py +2 -0
- stoobly_agent/app/models/factories/resource/local_db/helpers/create_request_columns_service.py +6 -3
- stoobly_agent/app/models/factories/resource/local_db/request_adapter.py +4 -5
- stoobly_agent/app/models/types/request.py +1 -0
- stoobly_agent/app/models/types/scenario.py +1 -0
- stoobly_agent/app/proxy/handle_test_service.py +1 -1
- stoobly_agent/app/proxy/test/context.py +3 -3
- stoobly_agent/app/proxy/test/context_abc.py +1 -1
- stoobly_agent/db/migrations/2023_05_15_212505_add_uuid_column_to_requests.py +1 -1
- stoobly_agent/db/migrations/2023_05_15_213119_add_uuid_column_to_scenarios.py +1 -1
- stoobly_agent/test/app/models/schemas/.stoobly/db/VERSION +1 -1
- {stoobly_agent-0.33.3.dist-info → stoobly_agent-0.33.4.dist-info}/METADATA +1 -1
- {stoobly_agent-0.33.3.dist-info → stoobly_agent-0.33.4.dist-info}/RECORD +17 -17
- {stoobly_agent-0.33.3.dist-info → stoobly_agent-0.33.4.dist-info}/LICENSE +0 -0
- {stoobly_agent-0.33.3.dist-info → stoobly_agent-0.33.4.dist-info}/WHEEL +0 -0
- {stoobly_agent-0.33.3.dist-info → stoobly_agent-0.33.4.dist-info}/entry_points.txt +0 -0
stoobly_agent/__init__.py
CHANGED
@@ -1,2 +1,2 @@
|
|
1
1
|
COMMAND = 'stoobly-agent'
|
2
|
-
VERSION = '0.33.
|
2
|
+
VERSION = '0.33.4'
|
@@ -1,5 +1,6 @@
|
|
1
1
|
import json
|
2
2
|
import pdb
|
3
|
+
import uuid
|
3
4
|
|
4
5
|
from datetime import datetime
|
5
6
|
from urllib.parse import urlparse
|
@@ -63,6 +64,7 @@ class RequestsController:
|
|
63
64
|
request, status = request_model.create(**{
|
64
65
|
**create_params,
|
65
66
|
'scenario_id': scenario_id,
|
67
|
+
'uuid': str(uuid.uuid4()),
|
66
68
|
})
|
67
69
|
|
68
70
|
if context.filter_response(request, status):
|
stoobly_agent/app/models/factories/resource/local_db/helpers/create_request_columns_service.py
CHANGED
@@ -19,11 +19,14 @@ def build_request_columns(flow: MitmproxyHTTPFlow, joined_request: JoinedRequest
|
|
19
19
|
'control': joined_request.request_string.control,
|
20
20
|
'latency': joined_request.response_string.latency,
|
21
21
|
'raw': joined_request.request_string.get(),
|
22
|
-
'status': flow.response.status_code,
|
23
|
-
'uuid': joined_request.request_string.request_id.strip(),
|
22
|
+
'status': flow.response.status_code,
|
24
23
|
}
|
25
24
|
|
26
|
-
return {
|
25
|
+
return {
|
26
|
+
**request_columns,
|
27
|
+
**params,
|
28
|
+
**{ 'uuid': params.get('uuid') or joined_request.request_string.request_id.strip() }
|
29
|
+
}
|
27
30
|
|
28
31
|
def build_response_columns(flow: MitmproxyHTTPFlow, joined_request: JoinedRequest):
|
29
32
|
response_columns: ResponseColumns = {
|
@@ -43,9 +43,11 @@ class LocalDBRequestAdapter(LocalDBAdapter):
|
|
43
43
|
flow: MitmproxyHTTPFlow = params['flow']
|
44
44
|
joined_request: JoinedRequest = params['joined_request']
|
45
45
|
scenario_id = params.get('scenario_id')
|
46
|
+
uuid = params.get('uuid')
|
47
|
+
|
48
|
+
request_columns = build_request_columns(flow, joined_request, is_deleted=False, scenario_id=scenario_id, uuid=uuid)
|
46
49
|
|
47
50
|
with ORM.instance().db.transaction():
|
48
|
-
request_columns = build_request_columns(flow, joined_request, is_deleted=False, scenario_id=scenario_id)
|
49
51
|
request_record = self.__request_orm.create(**request_columns)
|
50
52
|
|
51
53
|
response_columns = {
|
@@ -53,10 +55,7 @@ class LocalDBRequestAdapter(LocalDBAdapter):
|
|
53
55
|
**build_response_columns(flow, joined_request),
|
54
56
|
}
|
55
57
|
|
56
|
-
|
57
|
-
if not response_record:
|
58
|
-
request_record.delete()
|
59
|
-
return self.internal_error('Could not create requeset response')
|
58
|
+
self.__response_orm.create(**response_columns)
|
60
59
|
|
61
60
|
return self.success({
|
62
61
|
'list': [ORMToStooblyRequestTransformer(request_record, {}).transform()],
|
@@ -69,7 +69,7 @@ def __handle_mock_success(test_context: TestContext) -> None:
|
|
69
69
|
|
70
70
|
request_id = test_context.mock_request_id
|
71
71
|
if request_id:
|
72
|
-
expected = test_context.
|
72
|
+
expected = test_context.cached_rewritten_expected_response_content
|
73
73
|
upload_test_data = {
|
74
74
|
'expected_response': expected,
|
75
75
|
'log': log,
|
@@ -54,11 +54,11 @@ class TestContext(TestContextABC):
|
|
54
54
|
return self
|
55
55
|
|
56
56
|
@property
|
57
|
-
def
|
57
|
+
def cached_rewritten_expected_response_content(self) -> FuzzyContent:
|
58
58
|
if not self.__cached_rewritten_expected_response_content:
|
59
|
-
return
|
59
|
+
return self.rewritten_expected_response_content
|
60
60
|
|
61
|
-
return
|
61
|
+
return self.__cached_rewritten_expected_response_content
|
62
62
|
|
63
63
|
@property
|
64
64
|
def endpoint(self) -> EndpointFacade:
|
@@ -13,7 +13,7 @@ class AddUuidColumnToRequests(Migration):
|
|
13
13
|
Run the migrations.
|
14
14
|
"""
|
15
15
|
with self.schema.table('requests') as table:
|
16
|
-
table.string('uuid', 36).default('').index()
|
16
|
+
table.string('uuid', 36).default('').index().unique()
|
17
17
|
|
18
18
|
for request in Request.all():
|
19
19
|
control = RequestStringControl(request.control)
|
@@ -11,7 +11,7 @@ class AddUuidColumnToScenarios(Migration):
|
|
11
11
|
Run the migrations.
|
12
12
|
"""
|
13
13
|
with self.schema.table('scenarios') as table:
|
14
|
-
table.string('uuid', 36).index().
|
14
|
+
table.string('uuid', 36).default('').index().unique()
|
15
15
|
|
16
16
|
for scenario in Scenario.all():
|
17
17
|
scenario.update(uuid=str(uuid.uuid4()))
|
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.33.3
|
@@ -1,4 +1,4 @@
|
|
1
|
-
stoobly_agent/__init__.py,sha256=
|
1
|
+
stoobly_agent/__init__.py,sha256=Y5VZBgZQZWLQ0m_DInN_Fj7Gf_NSi2yUxceBK0KHO5U,45
|
2
2
|
stoobly_agent/app/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
3
3
|
stoobly_agent/app/api/__init__.py,sha256=FFSlVoTgjPfUNlYPr_7u6-P5Y4WOKyaUfAHtUcB-Xio,810
|
4
4
|
stoobly_agent/app/api/application_http_request_handler.py,sha256=jf4fkqjOiCeI2IM5Ro7ie0v_C6y0-7-5TIE_IKMPOfg,5513
|
@@ -9,7 +9,7 @@ stoobly_agent/app/api/proxy_controller.py,sha256=pelIy9CKS7-W1xsIEkes92uqfeHrthC
|
|
9
9
|
stoobly_agent/app/api/query_params_controller.py,sha256=y7DMlJgPkACfRoAd2KeCge0Z8Vy9LKDDHj_RnMo28HQ,3640
|
10
10
|
stoobly_agent/app/api/replayed_response_headers_controller.py,sha256=0rdNlw74L5KsQxKJyKUf_lfoxoh82xKkJ7m1Nmz_3sM,1768
|
11
11
|
stoobly_agent/app/api/replayed_responses_controller.py,sha256=bPd8MmS1mT1uuWoJ6uhJQk_dafISDGhH8yIyEjCRCvw,3435
|
12
|
-
stoobly_agent/app/api/requests_controller.py,sha256=
|
12
|
+
stoobly_agent/app/api/requests_controller.py,sha256=76KK0mPaQx4ETV5SeesJtD_HTR2IEORkLlRewgX5B28,9435
|
13
13
|
stoobly_agent/app/api/response_headers_controller.py,sha256=FoZnU_HBKtiyprO1V6ra_I7bSRDRLQV1pun3PeLD7kY,3022
|
14
14
|
stoobly_agent/app/api/responses_controller.py,sha256=C3eL9DGMJa-AVO5lMUxJj6UyCb2Rjy71CGEMHwBHTAA,3148
|
15
15
|
stoobly_agent/app/api/routes.py,sha256=ObPHWPMKEH8kn93SDOrqsahahgS6WDIJk6c9hpM2gzw,5463
|
@@ -110,7 +110,7 @@ stoobly_agent/app/models/factories/resource/local_db/__init__.py,sha256=47DEQpj8
|
|
110
110
|
stoobly_agent/app/models/factories/resource/local_db/body_adapter.py,sha256=lrnIX9vC8AGau4LgL6W3rQQsQxeSvDVsShZ-RLQQ_k4,1052
|
111
111
|
stoobly_agent/app/models/factories/resource/local_db/header_adapter.py,sha256=gIhWeoSPCK7gjL6CQFi39zYqkd38Lb1fVKhzW5DJSeE,2640
|
112
112
|
stoobly_agent/app/models/factories/resource/local_db/helpers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
113
|
-
stoobly_agent/app/models/factories/resource/local_db/helpers/create_request_columns_service.py,sha256=
|
113
|
+
stoobly_agent/app/models/factories/resource/local_db/helpers/create_request_columns_service.py,sha256=HABMelW-cvhm2WXaywbQcd4PQhzSrz4vAbN7uOdetXM,1541
|
114
114
|
stoobly_agent/app/models/factories/resource/local_db/helpers/log.py,sha256=BKIWS_UoRyZxbJ7Z3zU8gp-5Tvb1n3BLk-jprQje7uc,5252
|
115
115
|
stoobly_agent/app/models/factories/resource/local_db/helpers/log_event.py,sha256=qRws34HK5fv3C_rEoIzpeIwZrSVhCG9sLz_jiuIbatY,3373
|
116
116
|
stoobly_agent/app/models/factories/resource/local_db/helpers/request_builder.py,sha256=ZbYJ28LCpXNvNEy995-yZo9xfGRwekqtsGTSoN1gTPQ,3220
|
@@ -125,7 +125,7 @@ stoobly_agent/app/models/factories/resource/local_db/local_db_adapter.py,sha256=
|
|
125
125
|
stoobly_agent/app/models/factories/resource/local_db/orm_request_builder.py,sha256=4UjFY26ln2Drlg71R4AKY5vUZYbQ28HYQolJv3SBDqE,1581
|
126
126
|
stoobly_agent/app/models/factories/resource/local_db/query_param_adapter.py,sha256=fWtAGcaINMIM5pP0g19o8WUYa7xEMUguFesiqKJyn5A,3966
|
127
127
|
stoobly_agent/app/models/factories/resource/local_db/replayed_response_adapter.py,sha256=vUN9ARmRVrxKHpyzWB5w-XX-quOBMFpWOKkyBxTn6mM,3634
|
128
|
-
stoobly_agent/app/models/factories/resource/local_db/request_adapter.py,sha256=
|
128
|
+
stoobly_agent/app/models/factories/resource/local_db/request_adapter.py,sha256=1OPm_82fZ0XVEpfEGmI3Jov40Vlg6qfG7z7R8d72LHY,12376
|
129
129
|
stoobly_agent/app/models/factories/resource/local_db/response_adapter.py,sha256=g2plyjBm5NUu1W6SVZavM2PgUYW_DuynFt_MREFhPVI,3228
|
130
130
|
stoobly_agent/app/models/factories/resource/local_db/response_header_adapter.py,sha256=lSehvihNQgX6moFY0XLDyLkTeEweCRAwQ16QSdPsvEg,3070
|
131
131
|
stoobly_agent/app/models/factories/resource/local_db/scenario_adapter.py,sha256=K6ITkYTUeEPNGL4_skL80K5G1kgqLtlM3IwpwXsleMw,3883
|
@@ -154,10 +154,10 @@ stoobly_agent/app/models/schemas/request.py,sha256=3LByUJw3rYjuVLUTWCUeYYat0Jsly
|
|
154
154
|
stoobly_agent/app/models/types/__init__.py,sha256=TdT8MVvcJ1i4VJl-JN60FJBEQeYsKClyjuOFzIsGdgI,161
|
155
155
|
stoobly_agent/app/models/types/endpoint.py,sha256=ByQzSjbQJ7_SRleT74qUkOTHG4sGPK5IUk8VW75px-c,157
|
156
156
|
stoobly_agent/app/models/types/replayed_response.py,sha256=VbeX2yAPWACQBc7ePQ9PfU5Ot_Vq5aKFIGrPTvMQ8Xw,403
|
157
|
-
stoobly_agent/app/models/types/request.py,sha256=
|
157
|
+
stoobly_agent/app/models/types/request.py,sha256=zA5VJ316yoMTfSoHu9ab1wbOMzS1h6G2DAhjHb80mWI,705
|
158
158
|
stoobly_agent/app/models/types/request_components.py,sha256=6qEiadFnJWaTYfnxLblIOyRytLXx5FQ9yUzkWnHr0IM,471
|
159
159
|
stoobly_agent/app/models/types/response.py,sha256=OQNvHnyLvRSJF3E4A1GaROlZekKvflzsuTZH6hDx1tY,107
|
160
|
-
stoobly_agent/app/models/types/scenario.py,sha256=
|
160
|
+
stoobly_agent/app/models/types/scenario.py,sha256=865pzF2vlhpslWf_77KTcb3XmF0lO8_LJy7qzJJNWmQ,184
|
161
161
|
stoobly_agent/app/proxy/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
162
162
|
stoobly_agent/app/proxy/constants/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
163
163
|
stoobly_agent/app/proxy/constants/custom_response_codes.py,sha256=1CaApt_6W7GrxvN8_Ozbf_SEodVEQaNZRR2sMYpI0U8,40
|
@@ -165,7 +165,7 @@ stoobly_agent/app/proxy/context.py,sha256=XLteUEP8T8aT0hHI_jHDaL2382OaC7QyVwlni5
|
|
165
165
|
stoobly_agent/app/proxy/handle_mock_service.py,sha256=vAT-ZA-4hMVscRGWPmuon6xLYoDMHM9llaE9AQSHGPI,6056
|
166
166
|
stoobly_agent/app/proxy/handle_record_service.py,sha256=_6UT4vaLncPGp1XDlUVFTqyhlc6Tv70MDTSUwVw3y-U,3355
|
167
167
|
stoobly_agent/app/proxy/handle_replay_service.py,sha256=zBsDnmibMZtYUoi9y6co6Ou5-JYHVrKiWnsJKHSkKtk,1795
|
168
|
-
stoobly_agent/app/proxy/handle_test_service.py,sha256=
|
168
|
+
stoobly_agent/app/proxy/handle_test_service.py,sha256=s1sm7ChCDzWIPjGr8I7xUSbw1U_hprZPqVM_erNa-wo,4841
|
169
169
|
stoobly_agent/app/proxy/hot_reload.py,sha256=RM2xPMl9qHh5SgjnRE1mnz8GilreFSQf3wpiJ6ax0Mw,903
|
170
170
|
stoobly_agent/app/proxy/intercept_handler.py,sha256=dnKYi9lkJSoa0yLcxOwZ4nH9gljbPPExnnfAKxEXpLU,4190
|
171
171
|
stoobly_agent/app/proxy/intercept_settings.py,sha256=lniZHdq2RXVwJxWfAVpaXY5moyAtB_4fVH9y2L4mSxs,10047
|
@@ -209,8 +209,8 @@ stoobly_agent/app/proxy/run.py,sha256=y_qfwGGCVjH9i1zOTOdJxdpF5ehALRwhlxQGhcQn8O
|
|
209
209
|
stoobly_agent/app/proxy/settings.py,sha256=R0LkSa9HrkUXvCd-nur4syJePjbQZdlnAnOPpGnCx38,2172
|
210
210
|
stoobly_agent/app/proxy/simulate_intercept_service.py,sha256=R-L2dh2dfYFebttWXU0NwyxFI_jP6Ud36oKPC-T8HiI,1942
|
211
211
|
stoobly_agent/app/proxy/test/__init__.py,sha256=sHytzLWcRZIQ4bHISGWMeSoreXaK6imDzyx3zUAaBZw,122
|
212
|
-
stoobly_agent/app/proxy/test/context.py,sha256=
|
213
|
-
stoobly_agent/app/proxy/test/context_abc.py,sha256=
|
212
|
+
stoobly_agent/app/proxy/test/context.py,sha256=08Wssj3gDMjp2YHlEUTrVZqGawf-9UNAMI6GTM4A2zU,6744
|
213
|
+
stoobly_agent/app/proxy/test/context_abc.py,sha256=jjsRYrEzGBdiGbY_0CzAHb07tYjSF8hxfrYaAh4SUc0,3094
|
214
214
|
stoobly_agent/app/proxy/test/context_response.py,sha256=UJNGpW-Ageri42YBmpQ6vrIbFzggGf1Xndjca8MB6w4,1156
|
215
215
|
stoobly_agent/app/proxy/test/helpers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
216
216
|
stoobly_agent/app/proxy/test/helpers/diff_service.py,sha256=dljKIYRtDWqXnMN0AirU0yNz1AAKCOCRwN-JQgnbNpQ,1379
|
@@ -299,8 +299,8 @@ stoobly_agent/db/migrations/2023_02_02_022229_create_replayed_responses.py,sha25
|
|
299
299
|
stoobly_agent/db/migrations/2023_03_20_192909_add_http_version_column_to_requests.py,sha256=zgPRtjOCtAbRvKcVUrp4GStD20RBRFcWisSVBWEeP2I,515
|
300
300
|
stoobly_agent/db/migrations/2023_03_20_220448_add_http_version_column_to_responses.py,sha256=AO9NkHbPZYdiAFKjCVpBfLXq71H75j0HaIvfb9TlThk,509
|
301
301
|
stoobly_agent/db/migrations/2023_04_18_071327_align_requests.py,sha256=8ukE87FqHoMMQlAIqbx4j745OyduzQdldgqtp8oSgjw,1272
|
302
|
-
stoobly_agent/db/migrations/2023_05_15_212505_add_uuid_column_to_requests.py,sha256=
|
303
|
-
stoobly_agent/db/migrations/2023_05_15_213119_add_uuid_column_to_scenarios.py,sha256=
|
302
|
+
stoobly_agent/db/migrations/2023_05_15_212505_add_uuid_column_to_requests.py,sha256=4PLF70a7wxnWRs7uK_5S7I0jyUkXugY1L4abqdcLXFQ,875
|
303
|
+
stoobly_agent/db/migrations/2023_05_15_213119_add_uuid_column_to_scenarios.py,sha256=nfq2uOw9dIICq2gRYm4PlkgEUgcit01wEl1Hfajt7bk,610
|
304
304
|
stoobly_agent/db/migrations/2023_05_29_053649_add_overwritable_column_to_scenarios.py,sha256=VkhUaHR6nVsV_DeXEpT16z89m2MsPHEYGQV2Y2vCUqs,459
|
305
305
|
stoobly_agent/db/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
306
306
|
stoobly_agent/lib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
@@ -538,7 +538,7 @@ stoobly_agent/test/app/models/factories/resource/local_db/helpers/log_test.py,sh
|
|
538
538
|
stoobly_agent/test/app/models/factories/resource/local_db/helpers/tiebreak_scenario_request_test.py,sha256=Ft5POn1ZJqt3YOSdPOb0PwwCaIkBEpw3Jug9WAeAt-g,2863
|
539
539
|
stoobly_agent/test/app/models/factories/resource/local_db/request_adapter_test.py,sha256=Pzq1cBPnP9oSWG-p0c-VoymoHxgp483QmNwmV1b78RA,8453
|
540
540
|
stoobly_agent/test/app/models/factories/resource/local_db/response_adapter_test.py,sha256=9P95EKH5rZGOrmRkRIDlQZqtiLJHk9735og18Ffwpfw,2204
|
541
|
-
stoobly_agent/test/app/models/schemas/.stoobly/db/VERSION,sha256=
|
541
|
+
stoobly_agent/test/app/models/schemas/.stoobly/db/VERSION,sha256=ipg2i9SefXLciwum0uirgobiDm-pkJ_Xj3olIpxq0cs,6
|
542
542
|
stoobly_agent/test/app/models/schemas/.stoobly/db/stoobly_agent.sqlite3,sha256=ch8gNx6zIelLKQx65gwFx_LRNqUD3EC5xcHZ0ukIQiU,188416
|
543
543
|
stoobly_agent/test/app/models/schemas/.stoobly/settings.yml,sha256=vLwMjweKOdod6tSLtIlyBefPQuNXq9wio4kBaODKtAU,726
|
544
544
|
stoobly_agent/test/app/models/schemas/.stoobly/tmp/options.json,sha256=OTRzarwus48CTrItedXCrgQttJHSEZonEYc7R_knvYg,2212
|
@@ -569,8 +569,8 @@ stoobly_agent/test/mock_data/petstore.yaml,sha256=CCdliJky04Az4FIOkFA883uunwFDHL
|
|
569
569
|
stoobly_agent/test/mock_data/request_show_response.py,sha256=K_a0fP0QT58T8sX9PaM6hqtX1A1depZsqg_GsNPf--k,707
|
570
570
|
stoobly_agent/test/mock_data/uspto.yaml,sha256=6U5se7C3o-86J4m9xpOk9Npias399f5CbfWzR87WKwE,7835
|
571
571
|
stoobly_agent/test/test_helper.py,sha256=m_oAI7tmRYCNZdKfNqISWhMv3e44tjeYViQ3nTUfnos,1007
|
572
|
-
stoobly_agent-0.33.
|
573
|
-
stoobly_agent-0.33.
|
574
|
-
stoobly_agent-0.33.
|
575
|
-
stoobly_agent-0.33.
|
576
|
-
stoobly_agent-0.33.
|
572
|
+
stoobly_agent-0.33.4.dist-info/LICENSE,sha256=8QKGyy45eN76Zk52h8gu1DKX2B_gbWgZ3nzDLofEbaE,548
|
573
|
+
stoobly_agent-0.33.4.dist-info/METADATA,sha256=RmlDpnlgfth8HzssXYFQd72R-XsZvHtLgBmcObc538o,3304
|
574
|
+
stoobly_agent-0.33.4.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
|
575
|
+
stoobly_agent-0.33.4.dist-info/entry_points.txt,sha256=aq5wix5oC8MDQtmyPGU0xaFrsjJg7WH28NmXh2sc3Z8,56
|
576
|
+
stoobly_agent-0.33.4.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|