redis 5.1.1__tar.gz → 5.2.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.
- {redis-5.1.1/redis.egg-info → redis-5.2.0}/PKG-INFO +1 -1
- {redis-5.1.1 → redis-5.2.0}/redis/commands/search/aggregation.py +16 -0
- {redis-5.1.1 → redis-5.2.0/redis.egg-info}/PKG-INFO +1 -1
- {redis-5.1.1 → redis-5.2.0}/setup.py +1 -1
- {redis-5.1.1 → redis-5.2.0}/tests/test_asyncio/test_search.py +55 -0
- {redis-5.1.1 → redis-5.2.0}/tests/test_search.py +55 -0
- {redis-5.1.1 → redis-5.2.0}/INSTALL +0 -0
- {redis-5.1.1 → redis-5.2.0}/LICENSE +0 -0
- {redis-5.1.1 → redis-5.2.0}/MANIFEST.in +0 -0
- {redis-5.1.1 → redis-5.2.0}/README.md +0 -0
- {redis-5.1.1 → redis-5.2.0}/redis/__init__.py +0 -0
- {redis-5.1.1 → redis-5.2.0}/redis/_parsers/__init__.py +0 -0
- {redis-5.1.1 → redis-5.2.0}/redis/_parsers/base.py +0 -0
- {redis-5.1.1 → redis-5.2.0}/redis/_parsers/commands.py +0 -0
- {redis-5.1.1 → redis-5.2.0}/redis/_parsers/encoders.py +0 -0
- {redis-5.1.1 → redis-5.2.0}/redis/_parsers/helpers.py +0 -0
- {redis-5.1.1 → redis-5.2.0}/redis/_parsers/hiredis.py +0 -0
- {redis-5.1.1 → redis-5.2.0}/redis/_parsers/resp2.py +0 -0
- {redis-5.1.1 → redis-5.2.0}/redis/_parsers/resp3.py +0 -0
- {redis-5.1.1 → redis-5.2.0}/redis/_parsers/socket.py +0 -0
- {redis-5.1.1 → redis-5.2.0}/redis/asyncio/__init__.py +0 -0
- {redis-5.1.1 → redis-5.2.0}/redis/asyncio/client.py +0 -0
- {redis-5.1.1 → redis-5.2.0}/redis/asyncio/cluster.py +0 -0
- {redis-5.1.1 → redis-5.2.0}/redis/asyncio/connection.py +0 -0
- {redis-5.1.1 → redis-5.2.0}/redis/asyncio/lock.py +0 -0
- {redis-5.1.1 → redis-5.2.0}/redis/asyncio/retry.py +0 -0
- {redis-5.1.1 → redis-5.2.0}/redis/asyncio/sentinel.py +0 -0
- {redis-5.1.1 → redis-5.2.0}/redis/asyncio/utils.py +0 -0
- {redis-5.1.1 → redis-5.2.0}/redis/backoff.py +0 -0
- {redis-5.1.1 → redis-5.2.0}/redis/cache.py +0 -0
- {redis-5.1.1 → redis-5.2.0}/redis/client.py +0 -0
- {redis-5.1.1 → redis-5.2.0}/redis/cluster.py +0 -0
- {redis-5.1.1 → redis-5.2.0}/redis/commands/__init__.py +0 -0
- {redis-5.1.1 → redis-5.2.0}/redis/commands/bf/__init__.py +0 -0
- {redis-5.1.1 → redis-5.2.0}/redis/commands/bf/commands.py +0 -0
- {redis-5.1.1 → redis-5.2.0}/redis/commands/bf/info.py +0 -0
- {redis-5.1.1 → redis-5.2.0}/redis/commands/cluster.py +0 -0
- {redis-5.1.1 → redis-5.2.0}/redis/commands/core.py +0 -0
- {redis-5.1.1 → redis-5.2.0}/redis/commands/graph/__init__.py +0 -0
- {redis-5.1.1 → redis-5.2.0}/redis/commands/graph/commands.py +0 -0
- {redis-5.1.1 → redis-5.2.0}/redis/commands/graph/edge.py +0 -0
- {redis-5.1.1 → redis-5.2.0}/redis/commands/graph/exceptions.py +0 -0
- {redis-5.1.1 → redis-5.2.0}/redis/commands/graph/execution_plan.py +0 -0
- {redis-5.1.1 → redis-5.2.0}/redis/commands/graph/node.py +0 -0
- {redis-5.1.1 → redis-5.2.0}/redis/commands/graph/path.py +0 -0
- {redis-5.1.1 → redis-5.2.0}/redis/commands/graph/query_result.py +0 -0
- {redis-5.1.1 → redis-5.2.0}/redis/commands/helpers.py +0 -0
- {redis-5.1.1 → redis-5.2.0}/redis/commands/json/__init__.py +0 -0
- {redis-5.1.1 → redis-5.2.0}/redis/commands/json/_util.py +0 -0
- {redis-5.1.1 → redis-5.2.0}/redis/commands/json/commands.py +0 -0
- {redis-5.1.1 → redis-5.2.0}/redis/commands/json/decoders.py +0 -0
- {redis-5.1.1 → redis-5.2.0}/redis/commands/json/path.py +0 -0
- {redis-5.1.1 → redis-5.2.0}/redis/commands/redismodules.py +0 -0
- {redis-5.1.1 → redis-5.2.0}/redis/commands/search/__init__.py +0 -0
- {redis-5.1.1 → redis-5.2.0}/redis/commands/search/_util.py +0 -0
- {redis-5.1.1 → redis-5.2.0}/redis/commands/search/commands.py +0 -0
- {redis-5.1.1 → redis-5.2.0}/redis/commands/search/document.py +0 -0
- {redis-5.1.1 → redis-5.2.0}/redis/commands/search/field.py +0 -0
- {redis-5.1.1 → redis-5.2.0}/redis/commands/search/indexDefinition.py +0 -0
- {redis-5.1.1 → redis-5.2.0}/redis/commands/search/query.py +0 -0
- {redis-5.1.1 → redis-5.2.0}/redis/commands/search/querystring.py +0 -0
- {redis-5.1.1 → redis-5.2.0}/redis/commands/search/reducers.py +0 -0
- {redis-5.1.1 → redis-5.2.0}/redis/commands/search/result.py +0 -0
- {redis-5.1.1 → redis-5.2.0}/redis/commands/search/suggestion.py +0 -0
- {redis-5.1.1 → redis-5.2.0}/redis/commands/sentinel.py +0 -0
- {redis-5.1.1 → redis-5.2.0}/redis/commands/timeseries/__init__.py +0 -0
- {redis-5.1.1 → redis-5.2.0}/redis/commands/timeseries/commands.py +0 -0
- {redis-5.1.1 → redis-5.2.0}/redis/commands/timeseries/info.py +0 -0
- {redis-5.1.1 → redis-5.2.0}/redis/commands/timeseries/utils.py +0 -0
- {redis-5.1.1 → redis-5.2.0}/redis/connection.py +0 -0
- {redis-5.1.1 → redis-5.2.0}/redis/crc.py +0 -0
- {redis-5.1.1 → redis-5.2.0}/redis/credentials.py +0 -0
- {redis-5.1.1 → redis-5.2.0}/redis/exceptions.py +0 -0
- {redis-5.1.1 → redis-5.2.0}/redis/lock.py +0 -0
- {redis-5.1.1 → redis-5.2.0}/redis/ocsp.py +0 -0
- {redis-5.1.1 → redis-5.2.0}/redis/retry.py +0 -0
- {redis-5.1.1 → redis-5.2.0}/redis/sentinel.py +0 -0
- {redis-5.1.1 → redis-5.2.0}/redis/typing.py +0 -0
- {redis-5.1.1 → redis-5.2.0}/redis/utils.py +0 -0
- {redis-5.1.1 → redis-5.2.0}/redis.egg-info/SOURCES.txt +0 -0
- {redis-5.1.1 → redis-5.2.0}/redis.egg-info/dependency_links.txt +0 -0
- {redis-5.1.1 → redis-5.2.0}/redis.egg-info/requires.txt +0 -0
- {redis-5.1.1 → redis-5.2.0}/redis.egg-info/top_level.txt +0 -0
- {redis-5.1.1 → redis-5.2.0}/setup.cfg +0 -0
- {redis-5.1.1 → redis-5.2.0}/tests/__init__.py +0 -0
- {redis-5.1.1 → redis-5.2.0}/tests/conftest.py +0 -0
- {redis-5.1.1 → redis-5.2.0}/tests/mocks.py +0 -0
- {redis-5.1.1 → redis-5.2.0}/tests/ssl_utils.py +0 -0
- {redis-5.1.1 → redis-5.2.0}/tests/test_asyncio/__init__.py +0 -0
- {redis-5.1.1 → redis-5.2.0}/tests/test_asyncio/compat.py +0 -0
- {redis-5.1.1 → redis-5.2.0}/tests/test_asyncio/conftest.py +0 -0
- {redis-5.1.1 → redis-5.2.0}/tests/test_asyncio/mocks.py +0 -0
- {redis-5.1.1 → redis-5.2.0}/tests/test_asyncio/test_bloom.py +0 -0
- {redis-5.1.1 → redis-5.2.0}/tests/test_asyncio/test_cluster.py +0 -0
- {redis-5.1.1 → redis-5.2.0}/tests/test_asyncio/test_commands.py +0 -0
- {redis-5.1.1 → redis-5.2.0}/tests/test_asyncio/test_connect.py +0 -0
- {redis-5.1.1 → redis-5.2.0}/tests/test_asyncio/test_connection.py +0 -0
- {redis-5.1.1 → redis-5.2.0}/tests/test_asyncio/test_connection_pool.py +0 -0
- {redis-5.1.1 → redis-5.2.0}/tests/test_asyncio/test_credentials.py +0 -0
- {redis-5.1.1 → redis-5.2.0}/tests/test_asyncio/test_cwe_404.py +0 -0
- {redis-5.1.1 → redis-5.2.0}/tests/test_asyncio/test_encoding.py +0 -0
- {redis-5.1.1 → redis-5.2.0}/tests/test_asyncio/test_graph.py +0 -0
- {redis-5.1.1 → redis-5.2.0}/tests/test_asyncio/test_hash.py +0 -0
- {redis-5.1.1 → redis-5.2.0}/tests/test_asyncio/test_json.py +0 -0
- {redis-5.1.1 → redis-5.2.0}/tests/test_asyncio/test_lock.py +0 -0
- {redis-5.1.1 → redis-5.2.0}/tests/test_asyncio/test_monitor.py +0 -0
- {redis-5.1.1 → redis-5.2.0}/tests/test_asyncio/test_pipeline.py +0 -0
- {redis-5.1.1 → redis-5.2.0}/tests/test_asyncio/test_pubsub.py +0 -0
- {redis-5.1.1 → redis-5.2.0}/tests/test_asyncio/test_retry.py +0 -0
- {redis-5.1.1 → redis-5.2.0}/tests/test_asyncio/test_scripting.py +0 -0
- {redis-5.1.1 → redis-5.2.0}/tests/test_asyncio/test_sentinel.py +0 -0
- {redis-5.1.1 → redis-5.2.0}/tests/test_asyncio/test_sentinel_managed_connection.py +0 -0
- {redis-5.1.1 → redis-5.2.0}/tests/test_asyncio/test_timeseries.py +0 -0
- {redis-5.1.1 → redis-5.2.0}/tests/test_asyncio/testdata/jsontestdata.py +0 -0
- {redis-5.1.1 → redis-5.2.0}/tests/test_asyncio/testdata/titles.csv +0 -0
- {redis-5.1.1 → redis-5.2.0}/tests/test_asyncio/testdata/will_play_text.csv.bz2 +0 -0
- {redis-5.1.1 → redis-5.2.0}/tests/test_bloom.py +0 -0
- {redis-5.1.1 → redis-5.2.0}/tests/test_cache.py +0 -0
- {redis-5.1.1 → redis-5.2.0}/tests/test_cluster.py +0 -0
- {redis-5.1.1 → redis-5.2.0}/tests/test_command_parser.py +0 -0
- {redis-5.1.1 → redis-5.2.0}/tests/test_commands.py +0 -0
- {redis-5.1.1 → redis-5.2.0}/tests/test_connect.py +0 -0
- {redis-5.1.1 → redis-5.2.0}/tests/test_connection.py +0 -0
- {redis-5.1.1 → redis-5.2.0}/tests/test_connection_pool.py +0 -0
- {redis-5.1.1 → redis-5.2.0}/tests/test_credentials.py +0 -0
- {redis-5.1.1 → redis-5.2.0}/tests/test_encoding.py +0 -0
- {redis-5.1.1 → redis-5.2.0}/tests/test_function.py +0 -0
- {redis-5.1.1 → redis-5.2.0}/tests/test_graph.py +0 -0
- {redis-5.1.1 → redis-5.2.0}/tests/test_graph_utils/__init__.py +0 -0
- {redis-5.1.1 → redis-5.2.0}/tests/test_graph_utils/test_edge.py +0 -0
- {redis-5.1.1 → redis-5.2.0}/tests/test_graph_utils/test_node.py +0 -0
- {redis-5.1.1 → redis-5.2.0}/tests/test_graph_utils/test_path.py +0 -0
- {redis-5.1.1 → redis-5.2.0}/tests/test_hash.py +0 -0
- {redis-5.1.1 → redis-5.2.0}/tests/test_helpers.py +0 -0
- {redis-5.1.1 → redis-5.2.0}/tests/test_json.py +0 -0
- {redis-5.1.1 → redis-5.2.0}/tests/test_lock.py +0 -0
- {redis-5.1.1 → redis-5.2.0}/tests/test_monitor.py +0 -0
- {redis-5.1.1 → redis-5.2.0}/tests/test_multiprocessing.py +0 -0
- {redis-5.1.1 → redis-5.2.0}/tests/test_parsers/test_helpers.py +0 -0
- {redis-5.1.1 → redis-5.2.0}/tests/test_pipeline.py +0 -0
- {redis-5.1.1 → redis-5.2.0}/tests/test_pubsub.py +0 -0
- {redis-5.1.1 → redis-5.2.0}/tests/test_retry.py +0 -0
- {redis-5.1.1 → redis-5.2.0}/tests/test_scripting.py +0 -0
- {redis-5.1.1 → redis-5.2.0}/tests/test_sentinel.py +0 -0
- {redis-5.1.1 → redis-5.2.0}/tests/test_ssl.py +0 -0
- {redis-5.1.1 → redis-5.2.0}/tests/test_timeseries.py +0 -0
- {redis-5.1.1 → redis-5.2.0}/tests/test_utils.py +0 -0
- {redis-5.1.1 → redis-5.2.0}/tests/testdata/jsontestdata.py +0 -0
- {redis-5.1.1 → redis-5.2.0}/tests/testdata/titles.csv +0 -0
- {redis-5.1.1 → redis-5.2.0}/tests/testdata/will_play_text.csv.bz2 +0 -0
|
@@ -112,6 +112,7 @@ class AggregateRequest:
|
|
|
112
112
|
self._cursor = []
|
|
113
113
|
self._dialect = None
|
|
114
114
|
self._add_scores = False
|
|
115
|
+
self._scorer = "TFIDF"
|
|
115
116
|
|
|
116
117
|
def load(self, *fields: List[str]) -> "AggregateRequest":
|
|
117
118
|
"""
|
|
@@ -300,6 +301,17 @@ class AggregateRequest:
|
|
|
300
301
|
self._add_scores = True
|
|
301
302
|
return self
|
|
302
303
|
|
|
304
|
+
def scorer(self, scorer: str) -> "AggregateRequest":
|
|
305
|
+
"""
|
|
306
|
+
Use a different scoring function to evaluate document relevance.
|
|
307
|
+
Default is `TFIDF`.
|
|
308
|
+
|
|
309
|
+
:param scorer: The scoring function to use
|
|
310
|
+
(e.g. `TFIDF.DOCNORM` or `BM25`)
|
|
311
|
+
"""
|
|
312
|
+
self._scorer = scorer
|
|
313
|
+
return self
|
|
314
|
+
|
|
303
315
|
def verbatim(self) -> "AggregateRequest":
|
|
304
316
|
self._verbatim = True
|
|
305
317
|
return self
|
|
@@ -323,6 +335,9 @@ class AggregateRequest:
|
|
|
323
335
|
if self._verbatim:
|
|
324
336
|
ret.append("VERBATIM")
|
|
325
337
|
|
|
338
|
+
if self._scorer:
|
|
339
|
+
ret.extend(["SCORER", self._scorer])
|
|
340
|
+
|
|
326
341
|
if self._add_scores:
|
|
327
342
|
ret.append("ADDSCORES")
|
|
328
343
|
|
|
@@ -332,6 +347,7 @@ class AggregateRequest:
|
|
|
332
347
|
if self._loadall:
|
|
333
348
|
ret.append("LOAD")
|
|
334
349
|
ret.append("*")
|
|
350
|
+
|
|
335
351
|
elif self._loadfields:
|
|
336
352
|
ret.append("LOAD")
|
|
337
353
|
ret.append(str(len(self._loadfields)))
|
|
@@ -1556,6 +1556,61 @@ async def test_aggregations_add_scores(decoded_r: redis.Redis):
|
|
|
1556
1556
|
assert res.rows[1] == ["__score", "0.2"]
|
|
1557
1557
|
|
|
1558
1558
|
|
|
1559
|
+
@pytest.mark.redismod
|
|
1560
|
+
@skip_ifmodversion_lt("2.10.05", "search")
|
|
1561
|
+
async def test_aggregations_hybrid_scoring(decoded_r: redis.Redis):
|
|
1562
|
+
assert await decoded_r.ft().create_index(
|
|
1563
|
+
(
|
|
1564
|
+
TextField("name", sortable=True, weight=5.0),
|
|
1565
|
+
TextField("description", sortable=True, weight=5.0),
|
|
1566
|
+
VectorField(
|
|
1567
|
+
"vector",
|
|
1568
|
+
"HNSW",
|
|
1569
|
+
{"TYPE": "FLOAT32", "DIM": 2, "DISTANCE_METRIC": "COSINE"},
|
|
1570
|
+
),
|
|
1571
|
+
)
|
|
1572
|
+
)
|
|
1573
|
+
|
|
1574
|
+
assert await decoded_r.hset(
|
|
1575
|
+
"doc1",
|
|
1576
|
+
mapping={
|
|
1577
|
+
"name": "cat book",
|
|
1578
|
+
"description": "an animal book about cats",
|
|
1579
|
+
"vector": np.array([0.1, 0.2]).astype(np.float32).tobytes(),
|
|
1580
|
+
},
|
|
1581
|
+
)
|
|
1582
|
+
assert await decoded_r.hset(
|
|
1583
|
+
"doc2",
|
|
1584
|
+
mapping={
|
|
1585
|
+
"name": "dog book",
|
|
1586
|
+
"description": "an animal book about dogs",
|
|
1587
|
+
"vector": np.array([0.2, 0.1]).astype(np.float32).tobytes(),
|
|
1588
|
+
},
|
|
1589
|
+
)
|
|
1590
|
+
|
|
1591
|
+
query_string = "(@description:animal)=>[KNN 3 @vector $vec_param AS dist]"
|
|
1592
|
+
req = (
|
|
1593
|
+
aggregations.AggregateRequest(query_string)
|
|
1594
|
+
.scorer("BM25")
|
|
1595
|
+
.add_scores()
|
|
1596
|
+
.apply(hybrid_score="@__score + @dist")
|
|
1597
|
+
.load("*")
|
|
1598
|
+
.dialect(4)
|
|
1599
|
+
)
|
|
1600
|
+
|
|
1601
|
+
res = await decoded_r.ft().aggregate(
|
|
1602
|
+
req,
|
|
1603
|
+
query_params={"vec_param": np.array([0.11, 0.22]).astype(np.float32).tobytes()},
|
|
1604
|
+
)
|
|
1605
|
+
|
|
1606
|
+
if isinstance(res, dict):
|
|
1607
|
+
assert len(res["results"]) == 2
|
|
1608
|
+
else:
|
|
1609
|
+
assert len(res.rows) == 2
|
|
1610
|
+
for row in res.rows:
|
|
1611
|
+
len(row) == 6
|
|
1612
|
+
|
|
1613
|
+
|
|
1559
1614
|
@pytest.mark.redismod
|
|
1560
1615
|
@skip_if_redis_enterprise()
|
|
1561
1616
|
async def test_search_commands_in_pipeline(decoded_r: redis.Redis):
|
|
@@ -1466,6 +1466,61 @@ def test_aggregations_add_scores(client):
|
|
|
1466
1466
|
assert res.rows[1] == ["__score", "0.2"]
|
|
1467
1467
|
|
|
1468
1468
|
|
|
1469
|
+
@pytest.mark.redismod
|
|
1470
|
+
@skip_ifmodversion_lt("2.10.05", "search")
|
|
1471
|
+
async def test_aggregations_hybrid_scoring(client):
|
|
1472
|
+
client.ft().create_index(
|
|
1473
|
+
(
|
|
1474
|
+
TextField("name", sortable=True, weight=5.0),
|
|
1475
|
+
TextField("description", sortable=True, weight=5.0),
|
|
1476
|
+
VectorField(
|
|
1477
|
+
"vector",
|
|
1478
|
+
"HNSW",
|
|
1479
|
+
{"TYPE": "FLOAT32", "DIM": 2, "DISTANCE_METRIC": "COSINE"},
|
|
1480
|
+
),
|
|
1481
|
+
)
|
|
1482
|
+
)
|
|
1483
|
+
|
|
1484
|
+
client.hset(
|
|
1485
|
+
"doc1",
|
|
1486
|
+
mapping={
|
|
1487
|
+
"name": "cat book",
|
|
1488
|
+
"description": "an animal book about cats",
|
|
1489
|
+
"vector": np.array([0.1, 0.2]).astype(np.float32).tobytes(),
|
|
1490
|
+
},
|
|
1491
|
+
)
|
|
1492
|
+
client.hset(
|
|
1493
|
+
"doc2",
|
|
1494
|
+
mapping={
|
|
1495
|
+
"name": "dog book",
|
|
1496
|
+
"description": "an animal book about dogs",
|
|
1497
|
+
"vector": np.array([0.2, 0.1]).astype(np.float32).tobytes(),
|
|
1498
|
+
},
|
|
1499
|
+
)
|
|
1500
|
+
|
|
1501
|
+
query_string = "(@description:animal)=>[KNN 3 @vector $vec_param AS dist]"
|
|
1502
|
+
req = (
|
|
1503
|
+
aggregations.AggregateRequest(query_string)
|
|
1504
|
+
.scorer("BM25")
|
|
1505
|
+
.add_scores()
|
|
1506
|
+
.apply(hybrid_score="@__score + @dist")
|
|
1507
|
+
.load("*")
|
|
1508
|
+
.dialect(4)
|
|
1509
|
+
)
|
|
1510
|
+
|
|
1511
|
+
res = client.ft().aggregate(
|
|
1512
|
+
req,
|
|
1513
|
+
query_params={"vec_param": np.array([0.11, 0.21]).astype(np.float32).tobytes()},
|
|
1514
|
+
)
|
|
1515
|
+
|
|
1516
|
+
if isinstance(res, dict):
|
|
1517
|
+
assert len(res["results"]) == 2
|
|
1518
|
+
else:
|
|
1519
|
+
assert len(res.rows) == 2
|
|
1520
|
+
for row in res.rows:
|
|
1521
|
+
len(row) == 6
|
|
1522
|
+
|
|
1523
|
+
|
|
1469
1524
|
@pytest.mark.redismod
|
|
1470
1525
|
@skip_ifmodversion_lt("2.0.0", "search")
|
|
1471
1526
|
def test_index_definition(client):
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|