limits 5.6.0__tar.gz → 5.7.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.
Files changed (134) hide show
  1. {limits-5.6.0 → limits-5.7.0}/.github/workflows/main.yml +4 -1
  2. {limits-5.6.0 → limits-5.7.0}/HISTORY.rst +8 -0
  3. {limits-5.6.0 → limits-5.7.0}/PKG-INFO +3 -2
  4. {limits-5.6.0 → limits-5.7.0}/limits/_version.py +2 -2
  5. {limits-5.6.0 → limits-5.7.0}/limits/storage/mongodb.py +29 -29
  6. {limits-5.6.0 → limits-5.7.0}/pyproject.toml +8 -2
  7. limits-5.7.0/scripts/github_release_notes.sh +19 -0
  8. limits-5.7.0/tag.sh +71 -0
  9. {limits-5.6.0 → limits-5.7.0}/tests/benchmarks/test_storage.py +7 -7
  10. limits-5.7.0/tests/tls/ca.crt +31 -0
  11. limits-5.7.0/tests/tls/ca.key +52 -0
  12. limits-5.7.0/tests/tls/ca.txt +1 -0
  13. limits-5.7.0/tests/tls/client.crt +26 -0
  14. limits-5.7.0/tests/tls/client.key +28 -0
  15. limits-5.7.0/tests/tls/redis.crt +25 -0
  16. limits-5.7.0/tests/tls/redis.dh +8 -0
  17. limits-5.7.0/tests/tls/redis.key +28 -0
  18. limits-5.7.0/tests/tls/server.crt +26 -0
  19. limits-5.7.0/tests/tls/server.key +28 -0
  20. limits-5.7.0/uv.lock +2592 -0
  21. limits-5.6.0/.gitattributes +0 -2
  22. limits-5.6.0/CLASSIFIERS +0 -12
  23. limits-5.6.0/scripts/github_release_notes.sh +0 -8
  24. limits-5.6.0/setup.cfg +0 -25
  25. limits-5.6.0/tag.sh +0 -25
  26. limits-5.6.0/tests/tls/ca.crt +0 -32
  27. limits-5.6.0/tests/tls/ca.key +0 -52
  28. limits-5.6.0/tests/tls/ca.txt +0 -1
  29. limits-5.6.0/tests/tls/client.crt +0 -26
  30. limits-5.6.0/tests/tls/client.key +0 -28
  31. limits-5.6.0/tests/tls/redis.crt +0 -23
  32. limits-5.6.0/tests/tls/redis.dh +0 -8
  33. limits-5.6.0/tests/tls/redis.key +0 -28
  34. limits-5.6.0/tests/tls/server.crt +0 -26
  35. limits-5.6.0/tests/tls/server.key +0 -28
  36. limits-5.6.0/uv.lock +0 -1837
  37. {limits-5.6.0 → limits-5.7.0}/.devcontainer/devcontainer.json +0 -0
  38. {limits-5.6.0 → limits-5.7.0}/.github/FUNDING.yml +0 -0
  39. {limits-5.6.0 → limits-5.7.0}/.github/ISSUE_TEMPLATE/bug-report.md +0 -0
  40. {limits-5.6.0 → limits-5.7.0}/.github/ISSUE_TEMPLATE/feature.md +0 -0
  41. {limits-5.6.0 → limits-5.7.0}/.github/dependabot.yml +0 -0
  42. {limits-5.6.0 → limits-5.7.0}/.github/workflows/compatibility.yml +0 -0
  43. {limits-5.6.0 → limits-5.7.0}/.gitignore +0 -0
  44. {limits-5.6.0 → limits-5.7.0}/.readthedocs.yml +0 -0
  45. {limits-5.6.0 → limits-5.7.0}/CODE_OF_CONDUCT.md +0 -0
  46. {limits-5.6.0 → limits-5.7.0}/CONTRIBUTIONS.rst +0 -0
  47. {limits-5.6.0 → limits-5.7.0}/LICENSE.txt +0 -0
  48. {limits-5.6.0 → limits-5.7.0}/MANIFEST.in +0 -0
  49. {limits-5.6.0 → limits-5.7.0}/Makefile +0 -0
  50. {limits-5.6.0 → limits-5.7.0}/README.rst +0 -0
  51. {limits-5.6.0 → limits-5.7.0}/_netlify_headers +0 -0
  52. {limits-5.6.0 → limits-5.7.0}/doc/Makefile +0 -0
  53. {limits-5.6.0 → limits-5.7.0}/doc/source/_static/custom.css +0 -0
  54. {limits-5.6.0 → limits-5.7.0}/doc/source/api.rst +0 -0
  55. {limits-5.6.0 → limits-5.7.0}/doc/source/async.rst +0 -0
  56. {limits-5.6.0 → limits-5.7.0}/doc/source/changelog.rst +0 -0
  57. {limits-5.6.0 → limits-5.7.0}/doc/source/conf.py +0 -0
  58. {limits-5.6.0 → limits-5.7.0}/doc/source/custom-storage.rst +0 -0
  59. {limits-5.6.0 → limits-5.7.0}/doc/source/ext/_static/benchmark-chart.css +0 -0
  60. {limits-5.6.0 → limits-5.7.0}/doc/source/ext/_static/js/benchmark-chart.js +0 -0
  61. {limits-5.6.0 → limits-5.7.0}/doc/source/ext/_static/js/benchmark-details.js +0 -0
  62. {limits-5.6.0 → limits-5.7.0}/doc/source/ext/_static/js/benchmark-loader.js +0 -0
  63. {limits-5.6.0 → limits-5.7.0}/doc/source/ext/_templates/git_info.js +0 -0
  64. {limits-5.6.0 → limits-5.7.0}/doc/source/ext/bench_chart.py +0 -0
  65. {limits-5.6.0 → limits-5.7.0}/doc/source/index.rst +0 -0
  66. {limits-5.6.0 → limits-5.7.0}/doc/source/installation.rst +0 -0
  67. {limits-5.6.0 → limits-5.7.0}/doc/source/performance.rst +0 -0
  68. {limits-5.6.0 → limits-5.7.0}/doc/source/quickstart.rst +0 -0
  69. {limits-5.6.0 → limits-5.7.0}/doc/source/storage.rst +0 -0
  70. {limits-5.6.0 → limits-5.7.0}/doc/source/strategies.rst +0 -0
  71. {limits-5.6.0 → limits-5.7.0}/doc/source/theme_config.py +0 -0
  72. {limits-5.6.0 → limits-5.7.0}/docker-compose.yml +0 -0
  73. {limits-5.6.0 → limits-5.7.0}/limits/__init__.py +0 -0
  74. {limits-5.6.0 → limits-5.7.0}/limits/_version.pyi +0 -0
  75. {limits-5.6.0 → limits-5.7.0}/limits/aio/__init__.py +0 -0
  76. {limits-5.6.0 → limits-5.7.0}/limits/aio/storage/__init__.py +0 -0
  77. {limits-5.6.0 → limits-5.7.0}/limits/aio/storage/base.py +0 -0
  78. {limits-5.6.0 → limits-5.7.0}/limits/aio/storage/memcached/__init__.py +0 -0
  79. {limits-5.6.0 → limits-5.7.0}/limits/aio/storage/memcached/bridge.py +0 -0
  80. {limits-5.6.0 → limits-5.7.0}/limits/aio/storage/memcached/emcache.py +0 -0
  81. {limits-5.6.0 → limits-5.7.0}/limits/aio/storage/memcached/memcachio.py +0 -0
  82. {limits-5.6.0 → limits-5.7.0}/limits/aio/storage/memory.py +0 -0
  83. {limits-5.6.0 → limits-5.7.0}/limits/aio/storage/mongodb.py +0 -0
  84. {limits-5.6.0 → limits-5.7.0}/limits/aio/storage/redis/__init__.py +0 -0
  85. {limits-5.6.0 → limits-5.7.0}/limits/aio/storage/redis/bridge.py +0 -0
  86. {limits-5.6.0 → limits-5.7.0}/limits/aio/storage/redis/coredis.py +0 -0
  87. {limits-5.6.0 → limits-5.7.0}/limits/aio/storage/redis/redispy.py +0 -0
  88. {limits-5.6.0 → limits-5.7.0}/limits/aio/storage/redis/valkey.py +0 -0
  89. {limits-5.6.0 → limits-5.7.0}/limits/aio/strategies.py +0 -0
  90. {limits-5.6.0 → limits-5.7.0}/limits/errors.py +0 -0
  91. {limits-5.6.0 → limits-5.7.0}/limits/limits.py +0 -0
  92. {limits-5.6.0 → limits-5.7.0}/limits/py.typed +0 -0
  93. {limits-5.6.0 → limits-5.7.0}/limits/resources/redis/lua_scripts/acquire_moving_window.lua +0 -0
  94. {limits-5.6.0 → limits-5.7.0}/limits/resources/redis/lua_scripts/acquire_sliding_window.lua +0 -0
  95. {limits-5.6.0 → limits-5.7.0}/limits/resources/redis/lua_scripts/clear_keys.lua +0 -0
  96. {limits-5.6.0 → limits-5.7.0}/limits/resources/redis/lua_scripts/incr_expire.lua +0 -0
  97. {limits-5.6.0 → limits-5.7.0}/limits/resources/redis/lua_scripts/moving_window.lua +0 -0
  98. {limits-5.6.0 → limits-5.7.0}/limits/resources/redis/lua_scripts/sliding_window.lua +0 -0
  99. {limits-5.6.0 → limits-5.7.0}/limits/storage/__init__.py +0 -0
  100. {limits-5.6.0 → limits-5.7.0}/limits/storage/base.py +0 -0
  101. {limits-5.6.0 → limits-5.7.0}/limits/storage/memcached.py +0 -0
  102. {limits-5.6.0 → limits-5.7.0}/limits/storage/memory.py +0 -0
  103. {limits-5.6.0 → limits-5.7.0}/limits/storage/redis.py +0 -0
  104. {limits-5.6.0 → limits-5.7.0}/limits/storage/redis_cluster.py +0 -0
  105. {limits-5.6.0 → limits-5.7.0}/limits/storage/redis_sentinel.py +0 -0
  106. {limits-5.6.0 → limits-5.7.0}/limits/storage/registry.py +0 -0
  107. {limits-5.6.0 → limits-5.7.0}/limits/strategies.py +0 -0
  108. {limits-5.6.0 → limits-5.7.0}/limits/typing.py +0 -0
  109. {limits-5.6.0 → limits-5.7.0}/limits/util.py +0 -0
  110. {limits-5.6.0 → limits-5.7.0}/push-release.sh +0 -0
  111. {limits-5.6.0 → limits-5.7.0}/pytest.ini +0 -0
  112. {limits-5.6.0 → limits-5.7.0}/tests/__init__.py +0 -0
  113. {limits-5.6.0 → limits-5.7.0}/tests/aio/__init__.py +0 -0
  114. {limits-5.6.0 → limits-5.7.0}/tests/aio/storage/__init__.py +0 -0
  115. {limits-5.6.0 → limits-5.7.0}/tests/aio/storage/test_memory.py +0 -0
  116. {limits-5.6.0 → limits-5.7.0}/tests/aio/storage/test_redis.py +0 -0
  117. {limits-5.6.0 → limits-5.7.0}/tests/aio/test_storage.py +0 -0
  118. {limits-5.6.0 → limits-5.7.0}/tests/aio/test_strategy.py +0 -0
  119. {limits-5.6.0 → limits-5.7.0}/tests/benchmarks/__init__.py +0 -0
  120. {limits-5.6.0 → limits-5.7.0}/tests/benchmarks/conftest.py +0 -0
  121. {limits-5.6.0 → limits-5.7.0}/tests/conftest.py +0 -0
  122. {limits-5.6.0 → limits-5.7.0}/tests/data/memcached_auth.txt +0 -0
  123. {limits-5.6.0 → limits-5.7.0}/tests/integration/test_concurrency.py +0 -0
  124. {limits-5.6.0 → limits-5.7.0}/tests/storage/__init__.py +0 -0
  125. {limits-5.6.0 → limits-5.7.0}/tests/storage/test_memory.py +0 -0
  126. {limits-5.6.0 → limits-5.7.0}/tests/storage/test_redis.py +0 -0
  127. {limits-5.6.0 → limits-5.7.0}/tests/test_limit_granularities.py +0 -0
  128. {limits-5.6.0 → limits-5.7.0}/tests/test_limits.py +0 -0
  129. {limits-5.6.0 → limits-5.7.0}/tests/test_ratelimit_parser.py +0 -0
  130. {limits-5.6.0 → limits-5.7.0}/tests/test_storage.py +0 -0
  131. {limits-5.6.0 → limits-5.7.0}/tests/test_strategy.py +0 -0
  132. {limits-5.6.0 → limits-5.7.0}/tests/test_utils.py +0 -0
  133. {limits-5.6.0 → limits-5.7.0}/tests/tls/openssl.cnf +0 -0
  134. {limits-5.6.0 → limits-5.7.0}/tests/utils.py +0 -0
@@ -7,7 +7,7 @@ jobs:
7
7
  runs-on: ubuntu-latest
8
8
  strategy:
9
9
  matrix:
10
- python-version: ["3.10", "3.11", "3.12", "3.13"]
10
+ python-version: ["3.10", "3.11", "3.12", "3.13", "3.14"]
11
11
  steps:
12
12
  - uses: actions/checkout@v4
13
13
  - name: Install uv and Python
@@ -59,6 +59,9 @@ jobs:
59
59
  - python-version: "3.13"
60
60
  marker: 'not benchmark'
61
61
  os: ubuntu-latest
62
+ - python-version: "3.14"
63
+ marker: 'not benchmark'
64
+ os: ubuntu-latest
62
65
  runs-on: "${{ matrix.os }}"
63
66
  steps:
64
67
  - uses: actions/checkout@v4
@@ -3,6 +3,14 @@
3
3
  Changelog
4
4
  =========
5
5
 
6
+ v5.7.0
7
+ ------
8
+ Release Date: 2026-02-03
9
+
10
+ * Compatibility
11
+
12
+ * Relax extras constraints for redis (<8)
13
+
6
14
  v5.6.0
7
15
  ------
8
16
  Release Date: 2025-09-29
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: limits
3
- Version: 5.6.0
3
+ Version: 5.7.0
4
4
  Summary: Rate limiting utilities
5
5
  Project-URL: Homepage, https://limits.readthedocs.org
6
6
  Project-URL: Source, https://github.com/alisaifee/limits
@@ -19,6 +19,7 @@ Classifier: Programming Language :: Python :: 3.10
19
19
  Classifier: Programming Language :: Python :: 3.11
20
20
  Classifier: Programming Language :: Python :: 3.12
21
21
  Classifier: Programming Language :: Python :: 3.13
22
+ Classifier: Programming Language :: Python :: 3.14
22
23
  Classifier: Programming Language :: Python :: Implementation :: PyPy
23
24
  Classifier: Topic :: Software Development :: Libraries :: Python Modules
24
25
  Requires-Python: >=3.10
@@ -38,7 +39,7 @@ Requires-Dist: pymemcache<5.0.0,>3; extra == 'memcached'
38
39
  Provides-Extra: mongodb
39
40
  Requires-Dist: pymongo<5,>4.1; extra == 'mongodb'
40
41
  Provides-Extra: redis
41
- Requires-Dist: redis!=4.5.2,!=4.5.3,<7.0.0,>3; extra == 'redis'
42
+ Requires-Dist: redis!=4.5.2,!=4.5.3,<8.0.0,>3; extra == 'redis'
42
43
  Provides-Extra: rediscluster
43
44
  Requires-Dist: redis!=4.5.2,!=4.5.3,>=4.2.0; extra == 'rediscluster'
44
45
  Provides-Extra: valkey
@@ -28,7 +28,7 @@ version_tuple: VERSION_TUPLE
28
28
  commit_id: COMMIT_ID
29
29
  __commit_id__: COMMIT_ID
30
30
 
31
- __version__ = version = '5.6.0'
32
- __version_tuple__ = version_tuple = (5, 6, 0)
31
+ __version__ = version = '5.7.0'
32
+ __version_tuple__ = version_tuple = (5, 7, 0)
33
33
 
34
34
  __commit_id__ = commit_id = None
@@ -156,34 +156,34 @@ class MongoDBStorageBase(
156
156
  seconds=expiry
157
157
  )
158
158
 
159
- return int(
160
- self.counters.find_one_and_update(
161
- {"_id": key},
162
- [
163
- {
164
- "$set": {
165
- "count": {
166
- "$cond": {
167
- "if": {"$lt": ["$expireAt", "$$NOW"]},
168
- "then": amount,
169
- "else": {"$add": ["$count", amount]},
170
- }
171
- },
172
- "expireAt": {
173
- "$cond": {
174
- "if": {"$lt": ["$expireAt", "$$NOW"]},
175
- "then": expiration,
176
- "else": "$expireAt",
177
- }
178
- },
179
- }
180
- },
181
- ],
182
- upsert=True,
183
- projection=["count"],
184
- return_document=self.lib.ReturnDocument.AFTER,
185
- )["count"]
186
- )
159
+ if response := self.counters.find_one_and_update(
160
+ {"_id": key},
161
+ [
162
+ {
163
+ "$set": {
164
+ "count": {
165
+ "$cond": {
166
+ "if": {"$lt": ["$expireAt", "$$NOW"]},
167
+ "then": amount,
168
+ "else": {"$add": ["$count", amount]},
169
+ }
170
+ },
171
+ "expireAt": {
172
+ "$cond": {
173
+ "if": {"$lt": ["$expireAt", "$$NOW"]},
174
+ "then": expiration,
175
+ "else": "$expireAt",
176
+ }
177
+ },
178
+ }
179
+ },
180
+ ],
181
+ upsert=True,
182
+ projection=["count"],
183
+ return_document=self.lib.ReturnDocument.AFTER,
184
+ ):
185
+ return int(response["count"])
186
+ return 0
187
187
 
188
188
  def check(self) -> bool:
189
189
  """
@@ -468,7 +468,7 @@ class MongoDBStorageBase(
468
468
  return_document=self.lib.ReturnDocument.AFTER,
469
469
  upsert=True,
470
470
  )
471
- return cast(bool, result["_acquired"])
471
+ return cast(bool, result["_acquired"] if result else False)
472
472
 
473
473
  def clear_sliding_window(self, key: str, expiry: int) -> None:
474
474
  return self.clear(key)
@@ -25,6 +25,7 @@ classifiers = [
25
25
  "Programming Language :: Python :: 3.11",
26
26
  "Programming Language :: Python :: 3.12",
27
27
  "Programming Language :: Python :: 3.13",
28
+ "Programming Language :: Python :: 3.14",
28
29
  "Programming Language :: Python :: Implementation :: PyPy",
29
30
  ]
30
31
  dependencies = [
@@ -41,7 +42,7 @@ Documentation = "https://limits.readthedocs.org"
41
42
 
42
43
  [project.optional-dependencies]
43
44
  redis = [
44
- "redis>3,!=4.5.2,!=4.5.3,<7.0.0"
45
+ "redis>3,!=4.5.2,!=4.5.3,<8.0.0"
45
46
  ]
46
47
  rediscluster = [
47
48
  "redis>=4.2.0,!=4.5.2,!=4.5.3"
@@ -89,7 +90,7 @@ test = [
89
90
  "flaky",
90
91
  "lovely-pytest-docker",
91
92
  "pytest<9",
92
- "pytest-asyncio<0.27",
93
+ "pytest-asyncio",
93
94
  "pytest-benchmark[histogram]",
94
95
  "pytest-cov",
95
96
  "pytest-lazy-fixtures",
@@ -102,10 +103,12 @@ dev = [
102
103
  "mypy",
103
104
  "types-deprecated",
104
105
  "wheel",
106
+ "hatch",
105
107
  {include-group = "test"},
106
108
  ]
107
109
 
108
110
  ci = [
111
+ "redis!=7.1", # issues with async redis cluster (https://github.com/redis/redis-py/issues/3935)
109
112
  {include-group = "dev"},
110
113
 
111
114
  ]
@@ -139,3 +142,6 @@ typing-modules = ["limits.typing"]
139
142
  [tool.ruff.lint.isort]
140
143
  required-imports = ["from __future__ import annotations"]
141
144
 
145
+ [[tool.mypy.overrides]]
146
+ module = "limits.aio.storage.memcached.emcache"
147
+ ignore_errors = true
@@ -0,0 +1,19 @@
1
+ #!/bin/bash
2
+
3
+ TAG=$(echo $GITHUB_REF | cut -d / -f 3)
4
+ git format-patch -1 $TAG --stdout | grep -P '^\+' | \
5
+ sed '1,4d' | \
6
+ sed -E 's/^\+(.*)/\1/' | \
7
+ grep -v "Release Date" | \
8
+ # Convert top-level bullets (*) to headers (##)
9
+ sed -E -e 's/^\* (.*)/## \1/' | \
10
+ # Convert indented sub-bullets to Markdown '- '
11
+ sed -E -e 's/^ \* /- /' | \
12
+ # Remove any remaining 2-space indentation
13
+ sed -E -e 's/^ //' | \
14
+ # Convert inline code ``like_this`` to Markdown `like_this`
15
+ sed -E -e 's/``([^`]*)``/`\1`/g' | \
16
+ # Convert Sphinx roles :role:`text` or :role:`~path.to.Class` to just `text`
17
+ sed -E -e 's/:([a-z]+):`~?([^`]*)`/`\2`/g' | \
18
+ # Convert full links `text <url>`_ to Markdown [text](url)
19
+ sed -E -e 's/`([^`]*) <(https?:\/\/[^>]*)>`_/\[\1\](\2)/g'
limits-5.7.0/tag.sh ADDED
@@ -0,0 +1,71 @@
1
+ #!/bin/bash
2
+ set -euo pipefail
3
+
4
+ make lint
5
+
6
+ # last tag that is a release
7
+ last_tag=$(git tag | grep -v 'v' | sort -Vr | head -n 1)
8
+ echo "Current version: $(uv run hatch version), last tag: $last_tag"
9
+
10
+ read -p "New version: " new_version
11
+
12
+ # Find the last changelog portion to insert before
13
+ last_portion=$(grep -P "^Changelog$" HISTORY.rst -5 | grep -P "^v\d+\.\d+" || true)
14
+
15
+ # Get git notes (from the 'next' ref)
16
+ notes=$(GIT_NOTES_REF=refs/notes/next git log "$last_tag"..HEAD --pretty=format:'%N' || true)
17
+
18
+ python - <<PY
19
+ import datetime
20
+
21
+ history_file = "HISTORY.rst"
22
+ new_version = "$new_version"
23
+ last_portion = """$last_portion"""
24
+ notes = """$notes"""
25
+
26
+ # Trim leading/trailing blank lines from notes but preserve internal spacing
27
+ notes = notes.strip("\n")
28
+
29
+ # Build the new changelog block
30
+ heading = f"v{new_version}"
31
+ sep = "-" * len(heading)
32
+ release_date = datetime.date.today().isoformat()
33
+
34
+ new_changelog = "\n".join([
35
+ heading,
36
+ sep,
37
+ f"Release Date: {release_date}",
38
+ "",
39
+ notes,
40
+ ""
41
+ ]).strip("\n") + "\n\n" # ensure one blank line at the end
42
+
43
+ # Read HISTORY.rst and insert new changelog
44
+ content = open(history_file).read()
45
+ if last_portion:
46
+ updated = content.replace(last_portion, new_changelog + last_portion)
47
+ else:
48
+ updated = new_changelog + content
49
+
50
+ with open(history_file + ".new", "w", newline="\n") as f:
51
+ f.write(updated)
52
+ PY
53
+
54
+ mv HISTORY.rst.new HISTORY.rst
55
+
56
+ tmp_commits=$(mktemp)
57
+ git log "$last_tag"..HEAD --format='* %s (%h)%n%b' \
58
+ | sed -E '/^\*/! s/(.*)/ \1/g' > "$tmp_commits"
59
+
60
+ vim -O HISTORY.rst "$tmp_commits"
61
+
62
+ rm "$tmp_commits"
63
+
64
+ if rst2html HISTORY.rst > /dev/null 2>&1; then
65
+ echo "Tagging $new_version"
66
+ git add HISTORY.rst
67
+ git commit -m "Update changelog for ${new_version}"
68
+ git tag -s "$new_version" -m "Tag version ${new_version}"
69
+ else
70
+ echo "Changelog has errors. Skipping tag."
71
+ fi
@@ -1,5 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
+ import asyncio
3
4
  import functools
4
5
  import random
5
6
 
@@ -189,9 +190,8 @@ def test_test(benchmark, strategy, uri, args, limit, percentage_full, fixture):
189
190
  )
190
191
  @pytest.mark.parametrize("percentage_full", [5, 50, 95])
191
192
  @pytest.mark.benchmark(group="hit")
192
- def test_hit_async(
193
- event_loop, benchmark, strategy, uri, args, limit, percentage_full, fixture
194
- ):
193
+ def test_hit_async(benchmark, strategy, uri, args, limit, percentage_full, fixture):
194
+ event_loop = asyncio.new_event_loop()
195
195
  storage = storage_from_string(uri, **args)
196
196
  seed_limit(strategy(storage), limit, percentage_full, event_loop)
197
197
  benchmark.pedantic(
@@ -220,8 +220,9 @@ def test_hit_async(
220
220
  @pytest.mark.parametrize("percentage_full", [5, 50, 95])
221
221
  @pytest.mark.benchmark(group="get-window-stats")
222
222
  def test_get_window_stats_async(
223
- event_loop, benchmark, strategy, uri, args, limit, percentage_full, fixture
223
+ benchmark, strategy, uri, args, limit, percentage_full, fixture
224
224
  ):
225
+ event_loop = asyncio.new_event_loop()
225
226
  storage = storage_from_string(uri, **args)
226
227
  seed_limit(strategy(storage), limit, percentage_full, event_loop)
227
228
  benchmark.pedantic(
@@ -249,9 +250,8 @@ def test_get_window_stats_async(
249
250
  )
250
251
  @pytest.mark.parametrize("percentage_full", [5, 50, 95])
251
252
  @pytest.mark.benchmark(group="test")
252
- def test_test_async(
253
- event_loop, benchmark, strategy, uri, args, limit, percentage_full, fixture
254
- ):
253
+ def test_test_async(benchmark, strategy, uri, args, limit, percentage_full, fixture):
254
+ event_loop = asyncio.new_event_loop()
255
255
  storage = storage_from_string(uri, **args)
256
256
  seed_limit(strategy(storage), limit, percentage_full, event_loop)
257
257
  benchmark.pedantic(
@@ -0,0 +1,31 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIFWzCCA0OgAwIBAgIUL7QG8njONz/dob3v5Qm/sYQyz6owDQYJKoZIhvcNAQEL
3
+ BQAwNTETMBEGA1UECgwKUmVkaXMgVGVzdDEeMBwGA1UEAwwVQ2VydGlmaWNhdGUg
4
+ QXV0aG9yaXR5MB4XDTI1MTIxNzIyNTM1MVoXDTM1MTIxNTIyNTM1MVowNTETMBEG
5
+ A1UECgwKUmVkaXMgVGVzdDEeMBwGA1UEAwwVQ2VydGlmaWNhdGUgQXV0aG9yaXR5
6
+ MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAuzm53fhhMSFAPODknZXH
7
+ huVaocLo++bUnx2NwH2LHj1embk4B+lQoUbMpwCp3Hl7+2ZlRpCzrICgcWyqQDX7
8
+ j6ME2eaiNKTlj7BwrGvvtwIurFGa7VG19QmioM10PwAV6gbYI2xLOBnoHu0mXLuQ
9
+ Bywr+XbHMGIqKLutSVlnfxcb8uNWZGRF+cXDESoo3B6yqaonUB0opYbkTl2hmkzf
10
+ 9nQX5vbbBliBfVZKpkX+Mx53aVaLFSe1SE9IjXcq+s7vXYDzVefY9EpC4jUole5E
11
+ AClyU07hzv9jZ5Cx5QP56/FRhiEowzg24nnvfGy449Q4p3Lg6W3ejfbKooDQ5gER
12
+ /pxdUYiEzbXQNeEZ4H2iKH93Ud7KMqj3X60KT2mvkBj28NZ/6cGg834zYMObFPDD
13
+ URMGstd/eXGFLgyEDOmj5TsYYh8XEaPKjiukaehFP7cEyKe6SZTQpNnY1Nmx3EFg
14
+ p2jSwtGvDXmaug5w33Wo3BnUPjmsUwjbWdYPH4/XDpOwr0iw09OCH0//QyvMhOsp
15
+ zIHfpuimjE6ubtYAVSI210Go/ZsOOqBWKjwfyYSd1ONd3lJult+IbduOh8Cccq7a
16
+ ZhW2hpXXL1C68fJEMLXJWChilBHDvlolXRIB3KXhCQFhBPfTssVUTHoQ++Dkmr5C
17
+ PqHbrsrTztePNgZgGaOX//ECAwEAAaNjMGEwHQYDVR0OBBYEFKc/7fKKO3mIcLr9
18
+ UQpNwkmYENXzMB8GA1UdIwQYMBaAFKc/7fKKO3mIcLr9UQpNwkmYENXzMA8GA1Ud
19
+ EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgKEMA0GCSqGSIb3DQEBCwUAA4ICAQCW
20
+ lnekD51R5XUB6L4+J+AMkpOQyruuoqyfh5HjnXspI8GA2iuFOnKz+ztiIl7XLpsZ
21
+ C6ZqwVveinkDVG3jCBJbbh1VVCbda7z2WAT73g2FDGEzB95wsC+MFo/WfOTN/aIV
22
+ jBTa5KVzJC7cx6QJCdtfTrVD5eWRkG4rQ8ZLYEQfnb7Y7Q4TDSRe9R5y0AJNO1Vg
23
+ FFh4Ips3KBSFrrIUBprosfzUD9HgFHgfdpJjaFx2UB52LZp5SGt/mqZidKDB9jMe
24
+ P8Lb9RKpyLbBZOsFHTicINS7p+HQLjWz31dxGnjrQvF9WatNzC8W4INFP3chSLsd
25
+ 8qs9GrMvyILP2ld09K22ldB2+NAxdM97fT/cjl4/jlppbOPrm2Zo6oRo/Kwgolxf
26
+ AYw0Z3VIAbvUeMKM3ulDiRJ34Kkkc1V3ewz066O8rHo8ucs0Pb6fwwmgMGCkT57K
27
+ FOA4dkwoa4xLtNXRJlHUWF5clPT6yy7I7uchiBWJUY2w7Z2BtiXf+FzxiBq0/Kkk
28
+ O6frEvTmlO/xNzXmMifO75UF0nl4QwZCPmEIqX2H3MVVzwC6g2nT0KKkWyvpCBpw
29
+ COThMbY68hiWAxAl1k1bFWObBcQqUpmGYFSWKiLHGUpLTo13IC45QzzQ8EuSshgI
30
+ aedSa7YVBVOTdZc9Tvqh+WE8nBqbu+qmi7aUAypgyg==
31
+ -----END CERTIFICATE-----
@@ -0,0 +1,52 @@
1
+ -----BEGIN PRIVATE KEY-----
2
+ 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
51
+ BdEREvGtXO2rjcFjD1I3dw5PBe8TQw==
52
+ -----END PRIVATE KEY-----
@@ -0,0 +1 @@
1
+ 73B7C5C0894F16C629F6B85B283B4C63D00AB998
@@ -0,0 +1,26 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIEUDCCAjigAwIBAgIUc7fFwIlPFsYp9rhbKDtMY9AKuZcwDQYJKoZIhvcNAQEL
3
+ BQAwNTETMBEGA1UECgwKUmVkaXMgVGVzdDEeMBwGA1UEAwwVQ2VydGlmaWNhdGUg
4
+ QXV0aG9yaXR5MB4XDTI1MTIxNzIyNTM1MVoXDTM1MTIxNTIyNTM1MVowKzETMBEG
5
+ A1UECgwKUmVkaXMgVGVzdDEUMBIGA1UEAwwLQ2xpZW50LW9ubHkwggEiMA0GCSqG
6
+ SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCuxyBW8o1y+117ZbNPwzTz9ZBVhI5NclSt
7
+ eiDXl92eKrav6UIMMfKbRSTwQSP3EpyKcMZLnNBfjlpc+BNoZmOUCa7Tu9P6cu/1
8
+ cEOm5bDMcxpbCI6zO24vVD0Y1kCV7ShHBJ3cdEEgn/eKx0im4zg8mNPsYhI0muWC
9
+ AI51t94BR1MLKaSU4hfiPBSwisF2+ReVhf0s63chcJDQUDWe+D4t5O+REBQp5Ng0
10
+ uC/HKslLuC+eaIp3OBDxvO4pZh/ayjZ6y2w8wsVddoJXZyXRY2VD+I7Ig9TFMPum
11
+ 28WGSTz//mMTNMeA99tp2BSB3Q4Q4c9YrBbSwaMHlmNwOP7hcjh7AgMBAAGjYjBg
12
+ MAsGA1UdDwQEAwIFoDARBglghkgBhvhCAQEEBAMCB4AwHQYDVR0OBBYEFIrNZxLD
13
+ zWPPX/1jQ1zm+qaR2iCzMB8GA1UdIwQYMBaAFKc/7fKKO3mIcLr9UQpNwkmYENXz
14
+ MA0GCSqGSIb3DQEBCwUAA4ICAQBU6k05pIi8T6TLfdjabyfFWbJok5UR7kC9609q
15
+ OhAzs4he0OYEU77bOAaAA540O2Ig4KKF3rajGcdInJktDhzCctsE5oKyA9WWnem8
16
+ IQCPO/+a56MER37XGpKLo47lG7ZLVhFVUPPoyIwlZU1qrdlsd2ay6UHyvYeOiKoR
17
+ HkU+6htiIL7Ptg97YOee8mGcYAQG7uvjSoq7ONs2DHEU4qxAoCF53ATA+toeIMfr
18
+ PRBlf2jKxxhyWE/AK2K74cbpMPrm1/W4cy5aLH+7J7vGZp2Omfni89IATjGHkJnC
19
+ jKisuyMepJAGp7Y+QPWyv1sBjhljz2RZcquinqMr54ajgptJFakElme4BTt0anbJ
20
+ OUYvgG7iNVjFs9AYjXYr8Fmx0IS3AolOrAhbHwH/Py4fqAw2YHheuOvDHCuxWqSl
21
+ QHcUHSDdysKcPTOgqFgubabT1iZLuPxEbluySq+bhYc1zkww2FDh+n1zavX+8qoM
22
+ ZCwXq+DjJFgCwxthTYGKLX/iPv50hYyK6d3YC0CMD+XZMJxS7mity2dv45NmHUWA
23
+ mz5X3jK6KFOAfnBeDErmO2QP59Ox/IoAl3fdDxuv7ubjpGLO2QXrbM0Lq+N25LeS
24
+ 8KDdFJuIDH7p3rOHFNxecxGEsxyYAq1FLPZvm+55KoH+fjxhQ2iC7E3ZYhiK+lUd
25
+ 50nghw==
26
+ -----END CERTIFICATE-----
@@ -0,0 +1,28 @@
1
+ -----BEGIN PRIVATE KEY-----
2
+ MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCuxyBW8o1y+117
3
+ ZbNPwzTz9ZBVhI5NclSteiDXl92eKrav6UIMMfKbRSTwQSP3EpyKcMZLnNBfjlpc
4
+ +BNoZmOUCa7Tu9P6cu/1cEOm5bDMcxpbCI6zO24vVD0Y1kCV7ShHBJ3cdEEgn/eK
5
+ x0im4zg8mNPsYhI0muWCAI51t94BR1MLKaSU4hfiPBSwisF2+ReVhf0s63chcJDQ
6
+ UDWe+D4t5O+REBQp5Ng0uC/HKslLuC+eaIp3OBDxvO4pZh/ayjZ6y2w8wsVddoJX
7
+ ZyXRY2VD+I7Ig9TFMPum28WGSTz//mMTNMeA99tp2BSB3Q4Q4c9YrBbSwaMHlmNw
8
+ OP7hcjh7AgMBAAECggEABOzcnEalNiEfmcYcaaTXyFYvtTvmjLJ/m2Hj1199Yc3U
9
+ rHFiKJjRvDlpwzwlXiWP9BYd0xdTXJX/iuYnbzDky9ECtGRzIqLRi0pDcHUW6Ild
10
+ K+/k9ue3q61v3ql5qXVE8My7AXGPPPL1FVvspV361uOm+TQsTNTeny1n1lO89a6N
11
+ FssPQQTXhgSELsuKWvhDh4hENUm5mjVzmRmIjyPBW62rpgK5v+MHs6nOv1VIBYtO
12
+ xE9H52Pi/508741Y/JyF6YQj+1zoYEW5kZ7Z+LeNnDoHc4DoOJOJsbH6PK5T/cSi
13
+ seyvAktoAZgw1zShsgNCuRcd/+DcZnQb1uVuC25JBQKBgQDgvgK7xqMAnzsFmfgx
14
+ k1VdW3lUUnI3ds16Sr9LrDfFJtTaVLHftwtrzFS4E6k7nDkVP4D31YamxLalutr7
15
+ 2QYvheed8rif79IF/1CC6zUgzz6BaP0zUuFpmlnjtx+UCXujcC2A3IndSWjyAyT6
16
+ 4dVXiRJA34ss0+SI3EqV5Q8ubwKBgQDHFh/Dn2d35XTGdOSCX24PaUbAnlLeC0p4
17
+ VMFQnYdo3W2Ol4CLpThupR++PK90kvcfyJenhAkDHXGWbqSSPDDcPAP3BMUsxedS
18
+ CqLs+s7U1OIz+RvL0aplREypvYbDQ3KsnXRUWF1RLjL2IRaIOYUxUoupUQFs/JIX
19
+ 5DjDMqHctQKBgQDaOgcDeLUMxJEWNlTXJr5MYadlpoz7qGOLrQslmruot7UVsAns
20
+ Npxjd0yIVacNl/uh00ES5gbS5s6IDPHYfPrRqI+oQmjd/IwOgMUX6vZyvmpuVJkQ
21
+ fhkdZuCECmwiXjbtE99Lclp4QnEiFsWQyztSvWm5Dpfg1nviHS5bcMmWBwKBgQCN
22
+ O2i1QjQInkLFNs+UnVZaoHiM1MQ8uQ3PZ3DsW5RgFBVQfrG2XzM1aval4i8mJ8wg
23
+ RBExyT0LdKvL6Bnfk8ulsP2vEzc9l/eN//Ws4BAydAM0k5fgc5DJ3jX0hHtBsmt7
24
+ gQexfi5VFM0aRkbRxNx0LPbe2pSEWHjbcg/CifzBsQKBgDWIHOdOEhwnRDq7UOqv
25
+ FqGfRkBVdNvD/ESd8owz+kM+Kst50QEWBUHCXxPbhOpC2HcaY2LqBYrhLQ0eiqYj
26
+ bkaWcNE2shqTVO+fauN/3L975pIQxXRjmZ9LYE0P3khgVbCc2iSDWE1Xm6JdDxKA
27
+ JZ7vGQOFIc0IrZXHdEm4XDi0
28
+ -----END PRIVATE KEY-----
@@ -0,0 +1,25 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIEMTCCAhmgAwIBAgIUc7fFwIlPFsYp9rhbKDtMY9AKuZgwDQYJKoZIhvcNAQEL
3
+ BQAwNTETMBEGA1UECgwKUmVkaXMgVGVzdDEeMBwGA1UEAwwVQ2VydGlmaWNhdGUg
4
+ QXV0aG9yaXR5MB4XDTI1MTIxNzIyNTM1MVoXDTM1MTIxNTIyNTM1MVowLDETMBEG
5
+ A1UECgwKUmVkaXMgVGVzdDEVMBMGA1UEAwwMR2VuZXJpYy1jZXJ0MIIBIjANBgkq
6
+ hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAhdAcixqLKZMrV8UFhTATyee1NyxMkgRd
7
+ uCmXilDnRQdM+GfoTcm5kwg12prThYNDVRVZdO/elspWMvCGrO0ckBOBmHQNbgGl
8
+ 4wpqzpDrb40H5TKrjoR9PLua48e2+d7D7fS/6V3N2lv+m0S5b6evFu6WwEXmihsN
9
+ ojextu10ErjO2BS/sCVGcvjCFtWn6aOqriwl8uzluX9qwFVIvxQ9lWarGBNhm0DR
10
+ Zky8fPBtqERI+TS3kUpC8rOP5ZS0nd25ohevDNQqC5Kz+5z8p0//vzHXPAwg2toq
11
+ cuMlmYCYBk7IyM9A6KxK2wLST53Ypw3C897aGf47xNtfYO21GxXaJQIDAQABo0Iw
12
+ QDAdBgNVHQ4EFgQUe1u4VCdo9pvF0KEJLo/xEoGBrr8wHwYDVR0jBBgwFoAUpz/t
13
+ 8oo7eYhwuv1RCk3CSZgQ1fMwDQYJKoZIhvcNAQELBQADggIBAIAPR64sLCiTZTZP
14
+ Xyo3Ijw52qo2XVmxGnvcMN5e0Sjlh5RVxn2/R68GUDNipRsEvrYdy67fQmkLnGGo
15
+ EaeSFh1wouKONgq4LvtQMYyuGAVpOG4i9l59/krYI3aQPGc0ZNWXiXrOAGWh8pr2
16
+ IqGKTlzlSk6FsUmiFAwzMAMMmQgSL+YHT6r+d5eVv+i3gDgWren30si92ayCw8Ap
17
+ tTU51K+LDHgq7eMnh8ulXP0kKb+U/eNgZ5TsLgPJoPOamOwrlsXzhBZmG/dypCPP
18
+ +MrtDZdhvsGJm/dx1kuSiO2wP7qoqsrAplsUsr1K39/x7Z5z0IRWJ+rNFos9WOsJ
19
+ rtpeYbC7wFVbKjsYmcz5/QEo7TeJYo6Agx5Q6Ap9+ZUbUw0MG/aQ/+KtWfCxVPRo
20
+ Fm6AGI3uqz68UprDFZBKZqu0nSsEWNmq24gnofLRjFWPscqd2QN90sQTnOD1mmn5
21
+ mGqgcEXJ8kwuHmXCRuLm4evI2nEq7gCkC/9snWGBblo8LQBm86nrZNwyFO2L9WTT
22
+ V5s+8lJrtVDzWHefnYPxwAem4bHBb8fFgJCLyXJ8Nq7qRT/1fCyyEhIDclddi7JO
23
+ 6UICSlsqc2fHH6IZFK2TC8DyreCKIW24dvAfNuO+sFCW/vD7tkPKfEEBENDvf17f
24
+ aIta3lz2KKadKhZxZr52R2kgnpCk
25
+ -----END CERTIFICATE-----
@@ -0,0 +1,8 @@
1
+ -----BEGIN DH PARAMETERS-----
2
+ MIIBDAKCAQEA2K90soAmb6xjgGh5p1+FBu3MKhj/4hBQt7SqWiDdTs8mvqTmVH2r
3
+ 6iw/77x/paw1L1u1kQVLFAaVgjlTMIeu9TrAuU6MrDDdK0inuhkiqs49oLTPUvNc
4
+ 6CYrg//ULdFh0wJNeDPHhbkZ9SX9XqJjkQnsYXRuukWsKkU1sjeSWgyUO4Mr8MFy
5
+ AvQtUHLRKtJQlq6MTnFsVwPfHOLRpr67/pMYMCaa8lSFphJn3cT6bxqw6ErZQIeN
6
+ KW73pR780GNWt/gdQ09w2du73E3s4Mhh4oprtci/Uuj2VkfRuOR9q89Zk/13tsXp
7
+ trUPfFLsdRB953xyvGdddhmQJPEXWaLsjwIBAgICAOE=
8
+ -----END DH PARAMETERS-----
@@ -0,0 +1,28 @@
1
+ -----BEGIN PRIVATE KEY-----
2
+ MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCF0ByLGospkytX
3
+ xQWFMBPJ57U3LEySBF24KZeKUOdFB0z4Z+hNybmTCDXamtOFg0NVFVl0796WylYy
4
+ 8Ias7RyQE4GYdA1uAaXjCmrOkOtvjQflMquOhH08u5rjx7b53sPt9L/pXc3aW/6b
5
+ RLlvp68W7pbAReaKGw2iN7G27XQSuM7YFL+wJUZy+MIW1afpo6quLCXy7OW5f2rA
6
+ VUi/FD2VZqsYE2GbQNFmTLx88G2oREj5NLeRSkLys4/llLSd3bmiF68M1CoLkrP7
7
+ nPynT/+/Mdc8DCDa2ipy4yWZgJgGTsjIz0DorErbAtJPndinDcLz3toZ/jvE219g
8
+ 7bUbFdolAgMBAAECggEADBiOCU8AHGUmylt6I8TUTRs1E4SIHrzmoeKfRba0KSu/
9
+ Rpx8myeB2cDTaWw3Hv8Iw59XQ6L5P9qQzzBUjuYs1PibwuW0Cb58Dy7JDTImw3cq
10
+ qwpuXUbXBqSTcZqt4h7DyaCnBm00fKl14Ermk6lt7N3qt6e57sBXoP3K1+qADxRk
11
+ e0CFgadiySupGJWBonVrIuY/6Sn56QTVPRen9v0y8jU2Or3gVTzdR+/IOwgeRpVC
12
+ 0pbiESWME/MYoqxRIuJMLiQbHjDjgWUJ9ZZbJpvT2+FRdW4JUKdJb+f5RzTcMBcW
13
+ c8d3k4yd56VrZ8WKWqSmAJgEZvD97cvwsEBAoNhwowKBgQC7rPm3JB4yT3slbssn
14
+ L6uJ5RDLfGOpU2Mr786lC843w9UuQ+a/jZYn1pgm6Jc9gHYl09IbgeeBWBcTAuk9
15
+ iIws3/wRE27+KvgWA4oUugmGkdZXKLqiSIE3r8rZCrz2Skn+Belc1HfEGih22p9z
16
+ Z4sAC0R2z+/nOMpNEWOD3r9s8wKBgQC2hzpfhQZNrmhnjxLxBhCTQcxKD29mDmY+
17
+ UEoJxvFUERHniaY1htHXVuvIDYuY1HIy6SjDMfrbEEs8oXa0DhrYyWJS3VtjvULb
18
+ rb+huqjbH94Lx237kiuSJsa/nHpw5h4icE6wM4MAu1YlN3YEgEPdsoHJF+IdX50R
19
+ PIziSfCChwKBgQCF8pw8GVwv/khfXCdE7aIaBlKpWTtsY+a5Oiwb4kQpyuzBW5c6
20
+ ilxsTJ5FzuX68E/jCb7BAUNxLqUxXXeJAodBlA+9REiIwbRVSetohas8z6PSi3BB
21
+ WUxYqXA23pIlmroawq9fIQnl/eF5iuoZHQK5YlFYF2sbdY312X5UZUvs/wKBgDuI
22
+ KXrECUVG0BiOqo/f+YH94OJ63Et+AMzsJOnBcC6KDrvkwkgM+93vJKGwAUrMZ57B
23
+ OyFG6NmQG+nfg7bALvNr41zBg7ApJ2g86BaYqcAmSaav2ehGSV22tfYC1FCETWnQ
24
+ FWoUsvKHJ1amGyDmsLvbH8d1ubL432KizBR2JzJ7AoGAI3IKvmRHub688zTjP7Jt
25
+ tkfuF8O0LrBuIoqEwGrWuUzJF42kGjcngtEDQuQu1u/HKMWO099gf2t4uXDG9tAp
26
+ DGI5+Vn9bpO78iDLrha7VpCIDpLGrR36ld7qpUMx4s9uc1T1ErHjqfjLSHulCV/u
27
+ ZnvwTu1NQaBi6LtTtqYFPdo=
28
+ -----END PRIVATE KEY-----
@@ -0,0 +1,26 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIEUDCCAjigAwIBAgIUc7fFwIlPFsYp9rhbKDtMY9AKuZYwDQYJKoZIhvcNAQEL
3
+ BQAwNTETMBEGA1UECgwKUmVkaXMgVGVzdDEeMBwGA1UEAwwVQ2VydGlmaWNhdGUg
4
+ QXV0aG9yaXR5MB4XDTI1MTIxNzIyNTM1MVoXDTM1MTIxNTIyNTM1MVowKzETMBEG
5
+ A1UECgwKUmVkaXMgVGVzdDEUMBIGA1UEAwwLU2VydmVyLW9ubHkwggEiMA0GCSqG
6
+ SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCP14zt+Zdg0xXyzUcTOvrxewTwPB52FJJK
7
+ +g0/udfbSB9f/FE0CljTpGPU75LPWNy10IPMlGCi0X+SbofNVncTHZVSjzoRelKo
8
+ mmpJ7itryDNQInUsxDCEtIcZ6QUPrlkW373a7oyKiL13BHcnd3ZiUMr2mBr5UmDk
9
+ H6TEwOPmEni+fefJyjPUtGCiFawRMmpcWU7X8+N+T8k4M0An9EBEq8tvWCKWiJFt
10
+ c65kAhZlWczNE4dbrmOMGfCYwtF/R6kQvI+zV/dd83HrN1NAdMwSyvdizK8XZ3N/
11
+ YjDMCoTKnYif3UUKCR6UH7L33yQT3LG1OEMLj+l/RC1h7xhTcKPfAgMBAAGjYjBg
12
+ MAsGA1UdDwQEAwIFoDARBglghkgBhvhCAQEEBAMCBkAwHQYDVR0OBBYEFJGgf9VM
13
+ yyM/OXGsZzb/1tdB06lDMB8GA1UdIwQYMBaAFKc/7fKKO3mIcLr9UQpNwkmYENXz
14
+ MA0GCSqGSIb3DQEBCwUAA4ICAQBn5W7r7wYp1Hn2Aj+ANjQIIbikOJKtgcB9fo+s
15
+ blMT9VIxxYZ8CI49TKDS13YNgeGDoSifF1O+iQkNVlFSlWwYY/eyM0vm7qVBzTQ6
16
+ AiHRSajFX6FKkishYrA2Dw3A/XIQ5ifOjHeWsUTUgu4VAkxFuTKMphHMnMZFQ2fo
17
+ ycwE5R56qas5zRguj/lt7DULL3eg6D/TGCYiJIWbYZl/xp8FsfliCjxPiUrxEWPw
18
+ DeUGHNII57xNPfUbSkwxPUqrwXp4hE5vWixaDv93f3P8WwheRMYzmD95eDTsuapc
19
+ Bk+SHi/M+eY58XB6sHIJ7Q4xyUiR0KBo16VofmdFzCdPyFmmPAEkh5sK0sr160Nd
20
+ CPyPd+zDdkBImRQMb15VKGCBI0912sun/3pzgatW+4D6Ag5KALnMQ7MOodf6ADIi
21
+ je/6eZZ/MZceRIYe0oTATPC78Rkp4YfVHvmWetF9tgk1aCdrSjVCj9H+qXMm3fzk
22
+ 7sF9BF3g79l5TPUwCeGYRI8ltI+8lQK2MHXVyu7xy/WH+FAX6ZLOw3sbsHKlqUy1
23
+ fUB6sfaSDf3AujM66+0xNQ9hiDp/i2rpijiy1KyomiA2W5OwliNXacoSJ4SzVOmi
24
+ xHqtQYHUssZfLPo2HsDZHGOsFKJpNW9M0EySFMyc9qVFFrIEeNy9lMpPTNHguw3K
25
+ wHn88Q==
26
+ -----END CERTIFICATE-----
@@ -0,0 +1,28 @@
1
+ -----BEGIN PRIVATE KEY-----
2
+ MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCP14zt+Zdg0xXy
3
+ zUcTOvrxewTwPB52FJJK+g0/udfbSB9f/FE0CljTpGPU75LPWNy10IPMlGCi0X+S
4
+ bofNVncTHZVSjzoRelKommpJ7itryDNQInUsxDCEtIcZ6QUPrlkW373a7oyKiL13
5
+ BHcnd3ZiUMr2mBr5UmDkH6TEwOPmEni+fefJyjPUtGCiFawRMmpcWU7X8+N+T8k4
6
+ M0An9EBEq8tvWCKWiJFtc65kAhZlWczNE4dbrmOMGfCYwtF/R6kQvI+zV/dd83Hr
7
+ N1NAdMwSyvdizK8XZ3N/YjDMCoTKnYif3UUKCR6UH7L33yQT3LG1OEMLj+l/RC1h
8
+ 7xhTcKPfAgMBAAECggEANCZpjWP2yp9tLzTWhnXVQlSgIzsgrh3iNjW3NPn7dSCO
9
+ Y332sN/peX35xdtABlXI21AoYLUQ3icHUf8p1Dv7et44Y5DS9EA9lKw7SeeELZUN
10
+ aYm8osjUcGCFNNMjRx6mZSEkU6o2IQnXaz2et5vbu2RgWYwnB2qi/0IrujvWxHQ1
11
+ vwkUNAfGa2gnAAXuMpGlkdHTu/+78u5S/iX5Dfn/1rHTB7kYJkp9gCPW+n8AGCcM
12
+ m2y2AkKquh+yqS32q/sS0vtS5AK6Wc6MbErTR24pK/s6gMMMxO9d3XjKig6jQfkI
13
+ 1fEqVatwB0qUe02d8Wkq9JQPFh0Ubr7l1uJXOnU6UQKBgQDG+LYQbuusKHWy08pc
14
+ oenbrDDaznw4y2iKoBlQhNi/lPpiYSKSg0X+5R3wcnLqq7Afl35wujDNgPO9tb6J
15
+ vgyFAFK8h4+Zeaf5NeV2nXfA7WnMFrOx9ZoaVfCB+OhP4TbAGyH4vxd5nW4uh+UV
16
+ 4nl9s3REri7kApX3k3HtfxSBMQKBgQC5Ecc5esscK+QmXJbukcST2AuPzG04xrbN
17
+ +i85Q1iNG1ovf9JYPqFI/JArSYO45dG6EY4y83mOg8A30ps2SPpLDMaG/9P/vb7w
18
+ /NNKlwC4yV/e+noqjP+YiZHVPIDT20+kc8Bixl1aDbz9KHOIHmFyynIFl6Y9W8MG
19
+ Zaubs7myDwKBgFciO7jeml5+KWzyyr/eOCd3NL3dhxDoIxPyIKPeSX08pJnIp/c5
20
+ fcGuXHob5K9YGHz9PuXm49BbFGKT4Kk5jQoBpjnhs8UmPaUpMR/MvdDDJ320w2S/
21
+ hYja8cQ5WKMCoZNnTm08Ye9kPggqguwejc26dMRO80Huz/XnoBC9giFBAoGAEN60
22
+ AGNXHGxL0cti3sBe4PMyqpsB4ckLZN9Harre2Y4CvI20SOL8pMCRC8EZxsL8SS/M
23
+ fIyBKiKMZQpHp70jQ7AYcLnlQ0yymRkS0ZvOLwn8OUEv3a0Yp3jy2DM5sxYsvlrm
24
+ 0JowbEMQVStYzLGoRGR73FKkjrdMocqmx/ysErUCgYB5Q1gvK7ib9fq29t6Z3MvO
25
+ krDtjCEMZnvhKL33pfRnXHHfju3pwb45gAOd2WDkW0XVyaEoVbNcF5afySkBTYLI
26
+ z7Xsh0BxDoILFSc2QcHSpZVIe5xabijUbsnchpGfCxvQ2L65HV86ZB/vhI+zIiZK
27
+ kmc+RuVFanC68qLcgk/Syg==
28
+ -----END PRIVATE KEY-----