dbt-adapters 1.14.1__py3-none-any.whl → 1.14.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.
Potentially problematic release.
This version of dbt-adapters might be problematic. Click here for more details.
- dbt/adapters/__about__.py +1 -1
- dbt/adapters/base/impl.py +84 -2
- dbt/adapters/base/relation.py +9 -0
- dbt/adapters/catalogs/__init__.py +11 -0
- dbt/adapters/catalogs/_client.py +54 -0
- dbt/adapters/catalogs/_exceptions.py +32 -0
- dbt/adapters/catalogs/_integration.py +110 -0
- dbt/adapters/contracts/relation.py +1 -0
- dbt/adapters/events/adapter_types.proto +1 -0
- dbt/adapters/events/adapter_types_pb2.py +174 -174
- dbt/adapters/record/base.py +163 -0
- dbt/adapters/record/cursor/execute.py +21 -2
- dbt/adapters/record/cursor/fetchall.py +3 -0
- dbt/adapters/record/handle.py +16 -0
- dbt/adapters/record/serialization.py +31 -0
- dbt/adapters/sql/impl.py +6 -0
- dbt/include/global_project/macros/materializations/models/incremental/merge.sql +2 -2
- dbt/include/global_project/macros/python_model/python.sql +11 -0
- {dbt_adapters-1.14.1.dist-info → dbt_adapters-1.14.4.dist-info}/METADATA +1 -1
- {dbt_adapters-1.14.1.dist-info → dbt_adapters-1.14.4.dist-info}/RECORD +22 -16
- {dbt_adapters-1.14.1.dist-info → dbt_adapters-1.14.4.dist-info}/WHEEL +0 -0
- {dbt_adapters-1.14.1.dist-info → dbt_adapters-1.14.4.dist-info}/licenses/LICENSE +0 -0
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import dataclasses
|
|
2
2
|
import datetime
|
|
3
|
+
import decimal
|
|
3
4
|
from typing import Any, Dict, List, Mapping
|
|
4
5
|
|
|
5
6
|
from dbt_common.record import Record, Recorder
|
|
@@ -37,6 +38,8 @@ class CursorFetchAllResult:
|
|
|
37
38
|
return {"type": "date", "value": value.isoformat()}
|
|
38
39
|
elif type(value) is datetime.datetime:
|
|
39
40
|
return {"type": "datetime", "value": value.isoformat()}
|
|
41
|
+
elif type(value) is decimal.Decimal:
|
|
42
|
+
return float(value)
|
|
40
43
|
else:
|
|
41
44
|
return value
|
|
42
45
|
|
dbt/adapters/record/handle.py
CHANGED
|
@@ -22,3 +22,19 @@ class RecordReplayHandle:
|
|
|
22
22
|
# actual database access should be performed in that mode.
|
|
23
23
|
cursor = None if self.native_handle is None else self.native_handle.cursor()
|
|
24
24
|
return RecordReplayCursor(cursor, self.connection)
|
|
25
|
+
|
|
26
|
+
def commit(self):
|
|
27
|
+
self.native_handle.commit()
|
|
28
|
+
|
|
29
|
+
def rollback(self):
|
|
30
|
+
self.native_handle.rollback()
|
|
31
|
+
|
|
32
|
+
def close(self):
|
|
33
|
+
self.native_handle.close()
|
|
34
|
+
|
|
35
|
+
def get_backend_pid(self):
|
|
36
|
+
return self.native_handle.get_backend_pid()
|
|
37
|
+
|
|
38
|
+
@property
|
|
39
|
+
def closed(self):
|
|
40
|
+
return self.native_handle.closed
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
from datetime import datetime, date
|
|
2
|
+
from decimal import Decimal
|
|
3
|
+
from typing import Any, Dict, TYPE_CHECKING
|
|
4
|
+
|
|
5
|
+
if TYPE_CHECKING:
|
|
6
|
+
from agate import Table
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def _column_filter(val: Any) -> Any:
|
|
10
|
+
return (
|
|
11
|
+
float(val)
|
|
12
|
+
if isinstance(val, Decimal)
|
|
13
|
+
else (
|
|
14
|
+
str(val)
|
|
15
|
+
if isinstance(val, datetime)
|
|
16
|
+
else str(val) if isinstance(val, date) else str(val)
|
|
17
|
+
)
|
|
18
|
+
)
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def serialize_agate_table(table: "Table") -> Dict[str, Any]:
|
|
22
|
+
rows = []
|
|
23
|
+
for row in table.rows:
|
|
24
|
+
row = list(map(_column_filter, row))
|
|
25
|
+
rows.append(row)
|
|
26
|
+
|
|
27
|
+
return {
|
|
28
|
+
"column_names": table.column_names,
|
|
29
|
+
"column_types": [t.__class__.__name__ for t in table.column_types],
|
|
30
|
+
"rows": rows,
|
|
31
|
+
}
|
dbt/adapters/sql/impl.py
CHANGED
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
from typing import Any, List, Optional, Tuple, Type, TYPE_CHECKING
|
|
2
2
|
|
|
3
3
|
from dbt_common.events.functions import fire_event
|
|
4
|
+
from dbt_common.record import record_function
|
|
4
5
|
|
|
5
6
|
from dbt.adapters.base import BaseAdapter, BaseRelation, available
|
|
6
7
|
from dbt.adapters.cache import _make_ref_key_dict
|
|
7
8
|
from dbt.adapters.contracts.connection import AdapterResponse, Connection
|
|
8
9
|
from dbt.adapters.events.types import ColTypeChange, SchemaCreation, SchemaDrop
|
|
9
10
|
from dbt.adapters.exceptions import RelationTypeNullError
|
|
11
|
+
from dbt.adapters.record.base import AdapterTestSqlRecord
|
|
10
12
|
from dbt.adapters.sql.connections import SQLConnectionManager
|
|
11
13
|
|
|
12
14
|
LIST_RELATIONS_MACRO_NAME = "list_relations_without_caching"
|
|
@@ -255,6 +257,10 @@ class SQLAdapter(BaseAdapter):
|
|
|
255
257
|
return adapter_response
|
|
256
258
|
|
|
257
259
|
# This is for use in the test suite
|
|
260
|
+
@available
|
|
261
|
+
@record_function(
|
|
262
|
+
AdapterTestSqlRecord, method=True, index_on_thread_id=True, id_field_name="thread_id"
|
|
263
|
+
)
|
|
258
264
|
def run_sql_for_tests(self, sql, fetch, conn):
|
|
259
265
|
cursor = conn.handle.cursor()
|
|
260
266
|
try:
|
|
@@ -67,10 +67,10 @@
|
|
|
67
67
|
|
|
68
68
|
{%- set unique_key_str = unique_key|join(', ') -%}
|
|
69
69
|
|
|
70
|
-
delete from {{ target }}
|
|
70
|
+
delete from {{ target }} as DBT_INTERNAL_DEST
|
|
71
71
|
where ({{ unique_key_str }}) in (
|
|
72
72
|
select distinct {{ unique_key_str }}
|
|
73
|
-
from {{ source }}
|
|
73
|
+
from {{ source }} as DBT_INTERNAL_SOURCE
|
|
74
74
|
)
|
|
75
75
|
{%- if incremental_predicates %}
|
|
76
76
|
{% for predicate in incremental_predicates %}
|
|
@@ -12,6 +12,17 @@
|
|
|
12
12
|
{%- for _ref in model.refs -%}
|
|
13
13
|
{% set _ref_args = [_ref.get('package'), _ref['name']] if _ref.get('package') else [_ref['name'],] %}
|
|
14
14
|
{%- set resolved = ref(*_ref_args, v=_ref.get('version')) -%}
|
|
15
|
+
|
|
16
|
+
{#
|
|
17
|
+
We want to get the string of the returned relation by calling .render() in order to skip sample/empty
|
|
18
|
+
mode rendering logic. However, people override the default ref macro, and often return a string instead
|
|
19
|
+
of a relation (like the ref macro does by default). Thus, to make sure we dont blow things up, we have
|
|
20
|
+
to ensure the resolved relation has a .render() method.
|
|
21
|
+
#}
|
|
22
|
+
{%- if resolved.render is defined and resolved.render is callable -%}
|
|
23
|
+
{%- set resolved = resolved.render() -%}
|
|
24
|
+
{%- endif -%}
|
|
25
|
+
|
|
15
26
|
{%- if _ref.get('version') -%}
|
|
16
27
|
{% do _ref_args.extend(["v" ~ _ref['version']]) %}
|
|
17
28
|
{%- endif -%}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: dbt-adapters
|
|
3
|
-
Version: 1.14.
|
|
3
|
+
Version: 1.14.4
|
|
4
4
|
Summary: The set of adapter protocols and base functionality that supports integration with dbt-core
|
|
5
5
|
Project-URL: Homepage, https://github.com/dbt-labs/dbt-adapters/tree/main/dbt-adapters
|
|
6
6
|
Project-URL: Documentation, https://docs.getdbt.com
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
dbt/adapters/__about__.py,sha256=
|
|
1
|
+
dbt/adapters/__about__.py,sha256=ewFJx2dzMHmZWqpcxKLsBDjAJt_PseLEHqPgXPh6On8,19
|
|
2
2
|
dbt/adapters/__init__.py,sha256=3noHsg-64qI0_Pw6OR9F7l1vU2_qrJvinq8POTtuaZM,252
|
|
3
3
|
dbt/adapters/cache.py,sha256=WGy4ewnz-J13LverTACBW2iFhGswrWLgm-wiBrQnMzo,20084
|
|
4
4
|
dbt/adapters/capability.py,sha256=M3FkC9veKnNB7a7uQyl7EHX_AGNXPChbHAkcY4cgXCY,2534
|
|
@@ -11,21 +11,25 @@ dbt/adapters/base/README.md,sha256=muHQntC07Lh6L1XfVgwKhV5RltOPBLYPdQqd8_7l34c,5
|
|
|
11
11
|
dbt/adapters/base/__init__.py,sha256=Nc8lQVkOzAqdcxk4cw4E_raxN9CAWMwhQx4STdiicxg,456
|
|
12
12
|
dbt/adapters/base/column.py,sha256=Uj20UixoxCn2rlv4QDNONyys6CDkDFyG3anCXKf0T2c,5350
|
|
13
13
|
dbt/adapters/base/connections.py,sha256=-C5dOwGgMKH8n_v6wjwOxV7chBdS0GjOGwNQCUbhhWc,16951
|
|
14
|
-
dbt/adapters/base/impl.py,sha256=
|
|
14
|
+
dbt/adapters/base/impl.py,sha256=lXDMcU0FJgNgsJUyFjqLqFzdV1IYBUtSOI7p28Wd5jM,78214
|
|
15
15
|
dbt/adapters/base/meta.py,sha256=c5j0qeGec1cAi-IlVV_JkhMk01p5XqbtGj02uxGP1S4,5686
|
|
16
16
|
dbt/adapters/base/plugin.py,sha256=rm0GjNHnWM2mn0GJOjciZLwn-02xlzWCoMT9u-epwP0,1076
|
|
17
17
|
dbt/adapters/base/query_headers.py,sha256=UluGd9IYCYkoMiDi5Yx_lnrCOSjWppjwRro4SIGgx8I,3496
|
|
18
|
-
dbt/adapters/base/relation.py,sha256=
|
|
18
|
+
dbt/adapters/base/relation.py,sha256=tWVxqbJhU582UZbEtkj0jDTq0izm9l28AqA2CoK5KHc,19180
|
|
19
|
+
dbt/adapters/catalogs/__init__.py,sha256=Pm0EseleLEZRK3ML1FlID1aoVKeqOPqZvJ_TYYnURfY,372
|
|
20
|
+
dbt/adapters/catalogs/_client.py,sha256=XEKjpEg-C0OeQD_TzKKkmW5H_KyYyp2UAeiVBFnf_Ok,2236
|
|
21
|
+
dbt/adapters/catalogs/_exceptions.py,sha256=tPYk1-4n73GnY-a42wer0CJ9eyV4XEc28LrjvRp_r50,1129
|
|
22
|
+
dbt/adapters/catalogs/_integration.py,sha256=3tV2n4_zMIS9jqaPfA6Lhzn_REHBka7BHdsc7YJwC5c,6434
|
|
19
23
|
dbt/adapters/clients/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
20
24
|
dbt/adapters/clients/jinja.py,sha256=NsZOiBpOLunS46hRL5OcX1MpY3Ih6_87Vgz4qd_PNbc,768
|
|
21
25
|
dbt/adapters/contracts/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
22
26
|
dbt/adapters/contracts/connection.py,sha256=35mErirojY6Au63wjFgQokk_x7JWHjPUa6hiXjDEs0k,6917
|
|
23
27
|
dbt/adapters/contracts/macros.py,sha256=NYVDi5ww7v4ksKBwF836TXE-2xU4IBaUINqvxMY-ieU,366
|
|
24
|
-
dbt/adapters/contracts/relation.py,sha256=
|
|
28
|
+
dbt/adapters/contracts/relation.py,sha256=OefNzqp7iDqBn4qdE25eexC_QLGrV7m-T3jCZMMp9sc,4758
|
|
25
29
|
dbt/adapters/events/README.md,sha256=kVUFIsDQrHTUmk9Mmu-yXYkWh4pA5MJK_H6739rQr5I,3521
|
|
26
30
|
dbt/adapters/events/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
27
|
-
dbt/adapters/events/adapter_types.proto,sha256=
|
|
28
|
-
dbt/adapters/events/adapter_types_pb2.py,sha256=
|
|
31
|
+
dbt/adapters/events/adapter_types.proto,sha256=0vrNE_BYl0DO6UU-AvjSCylmrtQVBdqQoXeYyChzqmI,9704
|
|
32
|
+
dbt/adapters/events/adapter_types_pb2.py,sha256=uEf5Pl6Dp_s9W-ja8clwEQg9iLloLu0EqsbambYVIes,26849
|
|
29
33
|
dbt/adapters/events/base_types.py,sha256=sTlNRl15GaRIrIDVxalf7sK08dfo3Ol1Ua2jbFO7-7c,966
|
|
30
34
|
dbt/adapters/events/logging.py,sha256=1nRFswQubgUrVHL5DB9ewBtbEv1-OcIXC7mMmu3NOaM,2350
|
|
31
35
|
dbt/adapters/events/types.py,sha256=nW7_FgrEmWlM-HWPHrYcJ5K5QLZtfspLizyqlXrJaoE,12189
|
|
@@ -36,11 +40,13 @@ dbt/adapters/exceptions/compilation.py,sha256=2QsAX-z_1K4q8jGtvbC1JM6dEh7lyOF7rT
|
|
|
36
40
|
dbt/adapters/exceptions/connection.py,sha256=x82j2Ix242Slm6Ima8Tol3GLOB9yZYH5lq6IV1WKq54,445
|
|
37
41
|
dbt/adapters/exceptions/database.py,sha256=nIXJdQyPQOZaiKvCkQ3MoKlKOiaN58rtDZflw3CSkug,1618
|
|
38
42
|
dbt/adapters/record/__init__.py,sha256=u_0eJzN5RL90oL-RNoP2wWGMCGp0kG0lZ0uVWnnGdxs,123
|
|
39
|
-
dbt/adapters/record/
|
|
43
|
+
dbt/adapters/record/base.py,sha256=oqBeddunk9bAyNZBC2pWQohYtD6_ju_tf_74I6NAN04,4277
|
|
44
|
+
dbt/adapters/record/handle.py,sha256=95yR-tALNXVfOhhfCEOvfwDeHI7PwuT2Wr_knw5PXyw,1352
|
|
45
|
+
dbt/adapters/record/serialization.py,sha256=ehcLioi4J7TujP58fMNGcePuMxx-2G4Dj1KoYm6j6FU,756
|
|
40
46
|
dbt/adapters/record/cursor/cursor.py,sha256=rhk50XhOAWa4r1POSrb4-TX6MjJ-mwZfDsADxI41NYk,2412
|
|
41
47
|
dbt/adapters/record/cursor/description.py,sha256=5LNebP2AF2aicPWfM9FsD5r7SAmdac8TX_4NZfJQgPk,1060
|
|
42
|
-
dbt/adapters/record/cursor/execute.py,sha256=
|
|
43
|
-
dbt/adapters/record/cursor/fetchall.py,sha256=
|
|
48
|
+
dbt/adapters/record/cursor/execute.py,sha256=f8Yc1MKExj7QLbFnK8WnnwsoGESuYMWnFWhytbcAPjc,1271
|
|
49
|
+
dbt/adapters/record/cursor/fetchall.py,sha256=tcvxHOleST2vrP9Bs_HAbAGutLv9za2vH32HCl8ayc4,2149
|
|
44
50
|
dbt/adapters/record/cursor/fetchmany.py,sha256=6PTkVa6xZs1g3M4OdqFrnrF9x0vrNJyVNk6rLbhd_Mg,502
|
|
45
51
|
dbt/adapters/record/cursor/fetchone.py,sha256=IKtzTMQjSeK3g0svtWMXLx_7OGx6HpbPh1zicuOqARA,483
|
|
46
52
|
dbt/adapters/record/cursor/rowcount.py,sha256=BuiRd_JpQTPN3YaGACfsXe1vmsvO4c49kCpIBZoG6hE,515
|
|
@@ -51,7 +57,7 @@ dbt/adapters/relation_configs/config_change.py,sha256=hf6fDWbZpKvZdM6z-OtY-Gveip
|
|
|
51
57
|
dbt/adapters/relation_configs/config_validation.py,sha256=wlJUMwOEPhYFch-LRtEWfLNJMq8jL1tRhOUHmNX8nFw,1978
|
|
52
58
|
dbt/adapters/sql/__init__.py,sha256=WLWZJfqc8pr1N1BMVe9gM-KQ4URJIeKfLqTuJBD1VN0,107
|
|
53
59
|
dbt/adapters/sql/connections.py,sha256=JEMvgOW167je6J33Xj_Q605cB-9gDNOmCo3zdAnWiI8,8424
|
|
54
|
-
dbt/adapters/sql/impl.py,sha256=
|
|
60
|
+
dbt/adapters/sql/impl.py,sha256=dhpvlxc3mZWdcP42xMzW8_nM2zJGMMt1_hLUUfXx3Dw,10944
|
|
55
61
|
dbt/include/__init__.py,sha256=qEFeq3yuf3lQKVseALmL8aPM8fpCS54B_5pry00M3hk,76
|
|
56
62
|
dbt/include/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
57
63
|
dbt/include/global_project/__init__.py,sha256=-0HL5OkeJSrxglm1Y-UltTiBPY2BbWx8ZpTiJ7ypSvw,73
|
|
@@ -88,7 +94,7 @@ dbt/include/global_project/macros/materializations/models/clone/create_or_replac
|
|
|
88
94
|
dbt/include/global_project/macros/materializations/models/incremental/column_helpers.sql,sha256=hslQlGKW0oW97srfugsFVRR-L6RrzRcnwr3uLhzI0X4,2577
|
|
89
95
|
dbt/include/global_project/macros/materializations/models/incremental/incremental.sql,sha256=8gyBXan-saJ9GTSa8d05vMa-RSwyZ7pStOeHJpHU4BI,4374
|
|
90
96
|
dbt/include/global_project/macros/materializations/models/incremental/is_incremental.sql,sha256=Sm1TqOeqcCQofj3REFcA97yukPB1J_mClDd55r5GewE,478
|
|
91
|
-
dbt/include/global_project/macros/materializations/models/incremental/merge.sql,sha256=
|
|
97
|
+
dbt/include/global_project/macros/materializations/models/incremental/merge.sql,sha256=hrOgfAE3Aam0srudb0CgHZaAUFBnIXMAndoOncYP3T8,4840
|
|
92
98
|
dbt/include/global_project/macros/materializations/models/incremental/on_schema_change.sql,sha256=EOgcrYhwOGVPnyaBu7kIfe8LTOYVOu-AhxMtBs8ETpQ,4927
|
|
93
99
|
dbt/include/global_project/macros/materializations/models/incremental/strategies.sql,sha256=ORGWiYfj-b3_VIps9FDlyx-Q4A2hZzX2aYLocW8b6pU,2613
|
|
94
100
|
dbt/include/global_project/macros/materializations/seeds/helpers.sql,sha256=Y15ej-D3gm1ExIOMNT208q43gRk8d985WQBuGSooNL0,3920
|
|
@@ -101,7 +107,7 @@ dbt/include/global_project/macros/materializations/tests/helpers.sql,sha256=rxUx
|
|
|
101
107
|
dbt/include/global_project/macros/materializations/tests/test.sql,sha256=Rz3O_3dWHlIofG3d2CwsP2bXFimRZUIwOevyB0iz1J4,1831
|
|
102
108
|
dbt/include/global_project/macros/materializations/tests/unit.sql,sha256=KonePuFfwcz5uJ-JW0CrEy8_q-Gl45fonngGmFvQcNU,1252
|
|
103
109
|
dbt/include/global_project/macros/materializations/tests/where_subquery.sql,sha256=xjuYd18tXo99OReJGQsfgEPYljUUyF00XzK4h0SJjdM,497
|
|
104
|
-
dbt/include/global_project/macros/python_model/python.sql,sha256=
|
|
110
|
+
dbt/include/global_project/macros/python_model/python.sql,sha256=qWoouNOP4Qdune_2Vitzmrzb0soHRzu0S4K22amVZK8,4056
|
|
105
111
|
dbt/include/global_project/macros/relations/create.sql,sha256=99LLak1bhlhRw7yiI0c_4CKPlGyzqPBeBYBNeBPSmDo,701
|
|
106
112
|
dbt/include/global_project/macros/relations/create_backup.sql,sha256=jAWJSw3BUxvYrjgBs3JkRJN_VHXtk05lMWPM4n-toWs,524
|
|
107
113
|
dbt/include/global_project/macros/relations/create_intermediate.sql,sha256=bgPogZqRykUrdRxo_kvoKLrJ9C2x1c_TvtUZlYwUfmQ,568
|
|
@@ -157,7 +163,7 @@ dbt/include/global_project/macros/utils/right.sql,sha256=EwNG98CAFIwNDmarwopf7Rk
|
|
|
157
163
|
dbt/include/global_project/macros/utils/safe_cast.sql,sha256=1mswwkDACmIi1I99JKb_-vq3kjMe4HhMRV70mW8Bt4Y,298
|
|
158
164
|
dbt/include/global_project/macros/utils/split_part.sql,sha256=fXEIS0oIiYR7-4lYbb0QbZdG-q2TpV63AFd1ky4I5UM,714
|
|
159
165
|
dbt/include/global_project/tests/generic/builtin.sql,sha256=p94xdyPwb2TlxgLBqCfrcRfJ1QNgsjPvBm8f0Q5eqZM,1022
|
|
160
|
-
dbt_adapters-1.14.
|
|
161
|
-
dbt_adapters-1.14.
|
|
162
|
-
dbt_adapters-1.14.
|
|
163
|
-
dbt_adapters-1.14.
|
|
166
|
+
dbt_adapters-1.14.4.dist-info/METADATA,sha256=ECmusNk2qpmLk7kLzMoI0WAcNT99HFJkcJIx9mZHo8I,4494
|
|
167
|
+
dbt_adapters-1.14.4.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
|
168
|
+
dbt_adapters-1.14.4.dist-info/licenses/LICENSE,sha256=9yjigiJhWcCZvQjdagGKDwrRph58QWc5P2bVSQwXo6s,11344
|
|
169
|
+
dbt_adapters-1.14.4.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|