parameterrun 0.5.0__tar.gz → 0.5.2__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 (72) hide show
  1. {parameterrun-0.5.0 → parameterrun-0.5.2}/.github/workflows/ci.yml +10 -1
  2. parameterrun-0.5.2/.github/workflows/docs.yml +53 -0
  3. {parameterrun-0.5.0 → parameterrun-0.5.2}/.gitignore +3 -0
  4. {parameterrun-0.5.0 → parameterrun-0.5.2}/CHANGELOG.md +20 -0
  5. {parameterrun-0.5.0 → parameterrun-0.5.2}/PKG-INFO +64 -3
  6. {parameterrun-0.5.0 → parameterrun-0.5.2}/README.md +62 -2
  7. parameterrun-0.5.2/docs/assets/extra.css +33 -0
  8. parameterrun-0.5.2/docs/assets/favicon.ico +0 -0
  9. parameterrun-0.5.2/docs/assets/favicon.svg +13 -0
  10. parameterrun-0.5.2/docs/assets/logo-mark-dark.svg +9 -0
  11. parameterrun-0.5.2/docs/assets/logo-mark-light.svg +9 -0
  12. parameterrun-0.5.2/docs/assets/logo-readme-dark.svg +1 -0
  13. parameterrun-0.5.2/docs/assets/logo-readme-light.svg +1 -0
  14. parameterrun-0.5.2/docs/changelog.md +1 -0
  15. parameterrun-0.5.2/docs/contributing.md +3 -0
  16. parameterrun-0.5.2/docs/guide/backends.md +3 -0
  17. parameterrun-0.5.2/docs/guide/errors.md +5 -0
  18. parameterrun-0.5.2/docs/guide/progress.md +1 -0
  19. parameterrun-0.5.2/docs/guide/results.md +5 -0
  20. parameterrun-0.5.2/docs/index.md +14 -0
  21. parameterrun-0.5.2/docs/quickstart.md +5 -0
  22. parameterrun-0.5.2/docs/reference.md +12 -0
  23. {parameterrun-0.5.0/docs → parameterrun-0.5.2/internals}/github-actions.md +29 -5
  24. parameterrun-0.5.2/mkdocs.yml +91 -0
  25. {parameterrun-0.5.0 → parameterrun-0.5.2}/pyproject.toml +23 -4
  26. {parameterrun-0.5.0 → parameterrun-0.5.2}/src/parameterrun/__init__.py +1 -1
  27. {parameterrun-0.5.0 → parameterrun-0.5.2}/.github/workflows/publish.yml +0 -0
  28. {parameterrun-0.5.0 → parameterrun-0.5.2}/.github/workflows/release.yml +0 -0
  29. {parameterrun-0.5.0 → parameterrun-0.5.2}/CONTRIBUTING.md +0 -0
  30. {parameterrun-0.5.0 → parameterrun-0.5.2}/LICENSE +0 -0
  31. {parameterrun-0.5.0 → parameterrun-0.5.2}/dev/checkpointing_design.md +0 -0
  32. {parameterrun-0.5.0 → parameterrun-0.5.2}/dev/distributed_shuffle.py +0 -0
  33. {parameterrun-0.5.0 → parameterrun-0.5.2}/dev/profile_scalene.sh +0 -0
  34. {parameterrun-0.5.0 → parameterrun-0.5.2}/dev/very_large_swap.py +0 -0
  35. {parameterrun-0.5.0 → parameterrun-0.5.2}/examples/long_example.py +0 -0
  36. {parameterrun-0.5.0 → parameterrun-0.5.2}/examples/minimal_example.py +0 -0
  37. {parameterrun-0.5.0 → parameterrun-0.5.2}/examples/minimal_example_mpi.py +0 -0
  38. {parameterrun-0.5.0/docs → parameterrun-0.5.2/internals}/architecture.md +0 -0
  39. {parameterrun-0.5.0/docs → parameterrun-0.5.2/internals}/checkpoints-and-shuffle.md +0 -0
  40. {parameterrun-0.5.0 → parameterrun-0.5.2}/scripts/bump_version.py +0 -0
  41. {parameterrun-0.5.0 → parameterrun-0.5.2}/src/parameterrun/_checkpoint.py +0 -0
  42. {parameterrun-0.5.0 → parameterrun-0.5.2}/src/parameterrun/_delivery.py +0 -0
  43. {parameterrun-0.5.0 → parameterrun-0.5.2}/src/parameterrun/_errors.py +0 -0
  44. {parameterrun-0.5.0 → parameterrun-0.5.2}/src/parameterrun/_inputs.py +0 -0
  45. {parameterrun-0.5.0 → parameterrun-0.5.2}/src/parameterrun/_joblib_backend.py +0 -0
  46. {parameterrun-0.5.0 → parameterrun-0.5.2}/src/parameterrun/_mpi_dynamic.py +0 -0
  47. {parameterrun-0.5.0 → parameterrun-0.5.2}/src/parameterrun/_mpi_static.py +0 -0
  48. {parameterrun-0.5.0 → parameterrun-0.5.2}/src/parameterrun/_mpi_transfer.py +0 -0
  49. {parameterrun-0.5.0 → parameterrun-0.5.2}/src/parameterrun/_progress.py +0 -0
  50. {parameterrun-0.5.0 → parameterrun-0.5.2}/src/parameterrun/_pseudo_random.py +0 -0
  51. {parameterrun-0.5.0 → parameterrun-0.5.2}/src/parameterrun/_results.py +0 -0
  52. {parameterrun-0.5.0 → parameterrun-0.5.2}/src/parameterrun/_store.py +0 -0
  53. {parameterrun-0.5.0 → parameterrun-0.5.2}/src/parameterrun/_utils.py +0 -0
  54. {parameterrun-0.5.0 → parameterrun-0.5.2}/src/parameterrun/parallel_utils.py +0 -0
  55. {parameterrun-0.5.0 → parameterrun-0.5.2}/src/parameterrun/py.typed +0 -0
  56. {parameterrun-0.5.0 → parameterrun-0.5.2}/tests/test_checkpoint.py +0 -0
  57. {parameterrun-0.5.0 → parameterrun-0.5.2}/tests/test_delivery.py +0 -0
  58. {parameterrun-0.5.0 → parameterrun-0.5.2}/tests/test_depths.py +0 -0
  59. {parameterrun-0.5.0 → parameterrun-0.5.2}/tests/test_dynamic_schedule.py +0 -0
  60. {parameterrun-0.5.0 → parameterrun-0.5.2}/tests/test_format_input.py +0 -0
  61. {parameterrun-0.5.0 → parameterrun-0.5.2}/tests/test_get_iteration.py +0 -0
  62. {parameterrun-0.5.0 → parameterrun-0.5.2}/tests/test_joblib.py +0 -0
  63. {parameterrun-0.5.0 → parameterrun-0.5.2}/tests/test_mpi_integration.py +0 -0
  64. {parameterrun-0.5.0 → parameterrun-0.5.2}/tests/test_mpi_rank_scaling.py +0 -0
  65. {parameterrun-0.5.0 → parameterrun-0.5.2}/tests/test_normalized_time.py +0 -0
  66. {parameterrun-0.5.0 → parameterrun-0.5.2}/tests/test_on_error.py +0 -0
  67. {parameterrun-0.5.0 → parameterrun-0.5.2}/tests/test_parameter_run.py +0 -0
  68. {parameterrun-0.5.0 → parameterrun-0.5.2}/tests/test_pbar_format.py +0 -0
  69. {parameterrun-0.5.0 → parameterrun-0.5.2}/tests/test_pbar_options.py +0 -0
  70. {parameterrun-0.5.0 → parameterrun-0.5.2}/tests/test_pseudo_random.py +0 -0
  71. {parameterrun-0.5.0 → parameterrun-0.5.2}/tests/test_result_checks.py +0 -0
  72. {parameterrun-0.5.0 → parameterrun-0.5.2}/tests/test_review_regressions.py +0 -0
@@ -31,7 +31,16 @@ jobs:
31
31
  run: uv sync
32
32
 
33
33
  - name: Tests
34
- run: uv run pytest -m "not mpi and not mpi_subprocess"
34
+ run: uv run pytest -m "not mpi and not mpi_subprocess" --cov-report=xml
35
+
36
+ # One upload is enough for the README badge; a missing token or Codecov outage must not fail CI
37
+ - name: Upload coverage to Codecov
38
+ if: matrix.os == 'ubuntu-latest' && matrix.python-version == '3.12'
39
+ uses: codecov/codecov-action@v5
40
+ with:
41
+ files: coverage.xml
42
+ token: ${{ secrets.CODECOV_TOKEN }}
43
+ fail_ci_if_error: false
35
44
 
36
45
  - name: Lint
37
46
  run: uv run ruff check .
@@ -0,0 +1,53 @@
1
+ name: Docs
2
+
3
+ on:
4
+ pull_request:
5
+ branches: [main]
6
+ push:
7
+ branches: [main]
8
+ workflow_dispatch:
9
+
10
+ permissions:
11
+ contents: read
12
+
13
+ concurrency:
14
+ group: docs-${{ github.ref }}
15
+ cancel-in-progress: ${{ github.event_name == 'pull_request' }}
16
+
17
+ jobs:
18
+ build:
19
+ runs-on: ubuntu-latest
20
+ steps:
21
+ - uses: actions/checkout@v6
22
+
23
+ - uses: actions/setup-python@v6
24
+ with:
25
+ python-version: "3.12"
26
+
27
+ - name: Install uv
28
+ run: python -m pip install uv
29
+
30
+ - name: Sync docs environment
31
+ run: uv sync --only-group docs
32
+
33
+ - name: Build site
34
+ run: uv run --no-sync zensical build --strict
35
+
36
+ - uses: actions/upload-pages-artifact@v4
37
+ if: github.event_name != 'pull_request'
38
+ with:
39
+ path: site
40
+
41
+ deploy:
42
+ if: github.event_name != 'pull_request'
43
+ needs: build
44
+ runs-on: ubuntu-latest
45
+ permissions:
46
+ pages: write
47
+ id-token: write
48
+ environment:
49
+ name: github-pages
50
+ url: ${{ steps.deployment.outputs.page_url }}
51
+ steps:
52
+ - id: deployment
53
+ uses: actions/deploy-pages@v4
@@ -224,3 +224,6 @@ HPC_test/
224
224
 
225
225
  # Ferry ignore patterns
226
226
  .ferryignore
227
+
228
+ # Affinity lock files
229
+ *.af~lock~
@@ -4,6 +4,26 @@ All notable changes to this project are documented in this file.
4
4
 
5
5
  The format is based on Keep a Changelog and the project follows Semantic Versioning.
6
6
 
7
+ ## [Unreleased]
8
+
9
+ ## [0.5.2] - 2026-11-06
10
+
11
+ ### Changed
12
+
13
+ - Documentation site: the home page shows the navigation sidebar, duplicate page titles are gone, and the header logo
14
+ and the browser-tab icon use a single-colour version of the mark (dark on light themes, light on dark themes).
15
+ - CI runs only on pull requests into `main`, not again after the merge. The README CI and coverage badges follow the
16
+ pull-request runs.
17
+
18
+ ## [0.5.1] - 2026-11-06
19
+
20
+ ### Added
21
+
22
+ - Project logo: light/dark wordmark at the top of the README, plus icons, favicons and a GitHub social preview in
23
+ `logo/` (source file `logo/logos.af`). The `logo/` folder is excluded from the sdist.
24
+ - Documentation site at <https://davtax.github.io/ParameterRun/> (built with Zensical, checked on pull requests and deployed to GitHub Pages on every
25
+ push to `main`): user guide built from the README, API reference from the docstring, and changelog.
26
+
7
27
  ## [0.5.0] - 2026-11-06
8
28
 
9
29
  ### Added
@@ -1,8 +1,9 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: parameterrun
3
- Version: 0.5.0
3
+ Version: 0.5.2
4
4
  Summary: Parallel parameter sweeps with joblib/MPI and tqdm progress bars.
5
5
  Project-URL: Homepage, https://github.com/Davtax/ParameterRun
6
+ Project-URL: Documentation, https://davtax.github.io/ParameterRun/
6
7
  Project-URL: Repository, https://github.com/Davtax/ParameterRun
7
8
  Project-URL: Issues, https://github.com/Davtax/ParameterRun/issues
8
9
  Project-URL: Changelog, https://github.com/Davtax/ParameterRun/blob/main/CHANGELOG.md
@@ -31,8 +32,29 @@ Provides-Extra: mpi
31
32
  Requires-Dist: mpi4py>=3.1; extra == 'mpi'
32
33
  Description-Content-Type: text/markdown
33
34
 
34
- # ParameterRun
35
-
35
+ <h1 align="center">
36
+ <picture>
37
+ <source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/Davtax/ParameterRun/main/logo/svg/logo-readme-dark.svg">
38
+ <img src="https://raw.githubusercontent.com/Davtax/ParameterRun/main/logo/svg/logo-readme-light.svg" alt="ParameterRun" width="520">
39
+ </picture>
40
+ </h1>
41
+
42
+ <p align="center">
43
+ <a href="https://pypi.org/project/parameterrun/"><img src="https://img.shields.io/pypi/v/parameterrun" alt="PyPI"></a>
44
+ <a href="https://github.com/Davtax/ParameterRun/releases"><img src="https://img.shields.io/github/v/release/Davtax/ParameterRun" alt="GitHub release"></a>
45
+ <a href="https://pepy.tech/project/parameterrun"><img src="https://static.pepy.tech/badge/parameterrun/month" alt="Downloads"></a>
46
+ <a href="https://pypi.org/project/parameterrun/"><img src="https://img.shields.io/pypi/pyversions/parameterrun" alt="Python versions"></a>
47
+ <a href="https://github.com/Davtax/ParameterRun/actions/workflows/ci.yml"><img src="https://github.com/Davtax/ParameterRun/actions/workflows/ci.yml/badge.svg?event=pull_request" alt="CI"></a>
48
+ <a href="https://codecov.io/gh/Davtax/ParameterRun/tree/dev"><img src="https://codecov.io/gh/Davtax/ParameterRun/branch/dev/graph/badge.svg" alt="Coverage"></a>
49
+ <a href="https://github.com/Davtax/ParameterRun/blob/main/LICENSE"><img src="https://img.shields.io/pypi/l/parameterrun" alt="License"></a>
50
+ <a href="https://github.com/astral-sh/ruff"><img src="https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json" alt="Ruff"></a>
51
+ <a href="https://mypy-lang.org/"><img src="https://www.mypy-lang.org/static/mypy_badge.svg" alt="Checked with mypy"></a>
52
+ <a href="https://github.com/astral-sh/uv"><img src="https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/uv/main/assets/badge/v0.json" alt="uv"></a>
53
+ </p>
54
+
55
+ **Documentation:** <https://davtax.github.io/ParameterRun/>
56
+
57
+ <!-- --8<-- [start:intro] -->
36
58
  `parameterrun` is a lightweight utility for running parameter sweeps in Python with a simple, function-based API.
37
59
 
38
60
  It is designed for scientific and numerical workflows where you want to evaluate a function over one or more parameter
@@ -47,7 +69,9 @@ The package supports:
47
69
  - MPI execution with `mpi4py`
48
70
  - automatic reshaping of outputs into arrays
49
71
  - functions returning either one output or multiple outputs
72
+ <!-- --8<-- [end:intro] -->
50
73
 
74
+ <!-- --8<-- [start:install] -->
51
75
  ## Installation
52
76
 
53
77
  ### With `pip`
@@ -62,6 +86,9 @@ pip install parameterrun
62
86
  pip install parameterrun[mpi]
63
87
  ```
64
88
 
89
+ <!-- --8<-- [end:install] -->
90
+
91
+ <!-- --8<-- [start:idea] -->
65
92
  ## Basic idea
66
93
 
67
94
  The main entry point is:
@@ -74,6 +101,9 @@ The function `parameterrun(...)` evaluates a user-defined function over a set of
74
101
  sweep are identified by their names exactly as they appear in the target function signature. Additional fixed arguments
75
102
  can be passed as keyword arguments.
76
103
 
104
+ <!-- --8<-- [end:idea] -->
105
+
106
+ <!-- --8<-- [start:quickstart] -->
77
107
  ## Quick start
78
108
 
79
109
  ### 1. Single parameter
@@ -129,6 +159,9 @@ print(result.shape) # (2, 3)
129
159
 
130
160
  This grouped-input mode is useful when some parameters are logically linked and should not be combined independently.
131
161
 
162
+ <!-- --8<-- [end:quickstart] -->
163
+
164
+ <!-- --8<-- [start:outputs] -->
132
165
  ## Multiple outputs
133
166
 
134
167
  If the target function returns a tuple, parameterrun returns a list of arrays, one per output channel.
@@ -169,6 +202,9 @@ If `fun` returns `None` for some points (for example, a failed solver), a `Runti
169
202
  the parameters of the first one, because the result is then no longer a numeric array. Returning a NaN array of the
170
203
  right shape for failed points keeps the result numeric.
171
204
 
205
+ <!-- --8<-- [end:outputs] -->
206
+
207
+ <!-- --8<-- [start:errors] -->
172
208
  ## Errors in the function
173
209
 
174
210
  `on_error` controls what happens when `fun` raises an exception at some point:
@@ -188,6 +224,9 @@ result = parameterrun(my_function, param_names="x", param_values=[1, 2, 3], on_e
188
224
 
189
225
  Only `Exception` subclasses are caught: `KeyboardInterrupt` and `SystemExit` always propagate.
190
226
 
227
+ <!-- --8<-- [end:errors] -->
228
+
229
+ <!-- --8<-- [start:validation] -->
191
230
  ## Validation behavior
192
231
 
193
232
  `parameterrun` validates inputs before launching workers and raises clear `ValueError`s when:
@@ -197,6 +236,9 @@ Only `Exception` subclasses are caught: `KeyboardInterrupt` and `SystemExit` alw
197
236
  - extra keyword arguments do not match the target function signature
198
237
  - a keyword argument conflicts with a swept parameter name
199
238
 
239
+ <!-- --8<-- [end:validation] -->
240
+
241
+ <!-- --8<-- [start:backends] -->
200
242
  ## Parallel backend
201
243
 
202
244
  `parameterrun` supports two execution backends:
@@ -277,6 +319,9 @@ result = parameterrun(my_function, param_names="x", param_values=[1, 2, 3], back
277
319
 
278
320
  If rank 0 fails while finishing the result (for example with `reshape="strict"`), every rank raises instead of waiting.
279
321
 
322
+ <!-- --8<-- [end:backends] -->
323
+
324
+ <!-- --8<-- [start:saving] -->
280
325
  ## Saving the result to a file
281
326
 
282
327
  `result_file` writes the result, reshaped to the grid, to a `.npy` file on rank 0. With several outputs there is one
@@ -297,6 +342,9 @@ data = np.load("sweep.npy") # Same as result
297
342
  `RuntimeWarning`. String outputs are written as a NumPy string array.
298
343
  - The directory is checked before anything is computed.
299
344
 
345
+ <!-- --8<-- [end:saving] -->
346
+
347
+ <!-- --8<-- [start:checkpoints] -->
300
348
  ## Checkpoints for long runs
301
349
 
302
350
  `checkpoint` saves the finished points of a long run to a directory, so that a run killed by a crash, a node failure or
@@ -340,6 +388,9 @@ result = parameterrun(my_function, param_names=["x", "y"], param_values=[xs, ys]
340
388
  the previous snapshot. Numeric outputs are stored as plain arrays, read without pickle. Only non-numeric outputs
341
389
  (strings, dicts, ragged arrays, ...) are pickled: load such snapshots only from sources you trust.
342
390
 
391
+ <!-- --8<-- [end:checkpoints] -->
392
+
393
+ <!-- --8<-- [start:progress] -->
343
394
  ## Progress bars and verbosity
344
395
 
345
396
  By default (`pbar_bool=None`), the progress bar is shown when the output is a terminal or a Jupyter notebook, and hidden
@@ -362,6 +413,9 @@ result = parameterrun(my_function, param_names="x", param_values=[1, 2, 3], verb
362
413
  The progress-bar description is generated automatically from the function name and parameter names, unless you provide
363
414
  `desc` explicitly.
364
415
 
416
+ <!-- --8<-- [end:progress] -->
417
+
418
+ <!-- --8<-- [start:api] -->
365
419
  ## API reference
366
420
 
367
421
  `parameterrun`
@@ -398,6 +452,9 @@ parameterrun(fun, param_names, param_values, n_workers=-1, pbar_bool=None, pbar_
398
452
  * `keep_checkpoint`: keep the snapshot after success (default `True`)
399
453
  * `**kwargs`: extra fixed keyword arguments forwarded to `fun`. They cannot reuse the names of the parameters above.
400
454
 
455
+ <!-- --8<-- [end:api] -->
456
+
457
+ <!-- --8<-- [start:inputs] -->
401
458
  ## Input formats
402
459
 
403
460
  `parameterrun` accepts three input styles.
@@ -426,6 +483,9 @@ param_names = [["x", "y"], ["z"]]
426
483
  param_values = [[[1, 2], [10, 20]], [[100, 200, 300]], ]
427
484
  ```
428
485
 
486
+ <!-- --8<-- [end:inputs] -->
487
+
488
+ <!-- --8<-- [start:devchecks] -->
429
489
  ## Development checks
430
490
 
431
491
  Before opening a PR or publishing a release, run:
@@ -445,3 +505,4 @@ uv sync --extra mpi
445
505
  mpirun -n 4 uv run pytest -m mpi -o addopts="-q -m mpi"
446
506
  ```
447
507
 
508
+ <!-- --8<-- [end:devchecks] -->
@@ -1,5 +1,26 @@
1
- # ParameterRun
2
-
1
+ <h1 align="center">
2
+ <picture>
3
+ <source media="(prefers-color-scheme: dark)" srcset="logo/svg/logo-readme-dark.svg">
4
+ <img src="logo/svg/logo-readme-light.svg" alt="ParameterRun" width="520">
5
+ </picture>
6
+ </h1>
7
+
8
+ <p align="center">
9
+ <a href="https://pypi.org/project/parameterrun/"><img src="https://img.shields.io/pypi/v/parameterrun" alt="PyPI"></a>
10
+ <a href="https://github.com/Davtax/ParameterRun/releases"><img src="https://img.shields.io/github/v/release/Davtax/ParameterRun" alt="GitHub release"></a>
11
+ <a href="https://pepy.tech/project/parameterrun"><img src="https://static.pepy.tech/badge/parameterrun/month" alt="Downloads"></a>
12
+ <a href="https://pypi.org/project/parameterrun/"><img src="https://img.shields.io/pypi/pyversions/parameterrun" alt="Python versions"></a>
13
+ <a href="https://github.com/Davtax/ParameterRun/actions/workflows/ci.yml"><img src="https://github.com/Davtax/ParameterRun/actions/workflows/ci.yml/badge.svg?event=pull_request" alt="CI"></a>
14
+ <a href="https://codecov.io/gh/Davtax/ParameterRun/tree/dev"><img src="https://codecov.io/gh/Davtax/ParameterRun/branch/dev/graph/badge.svg" alt="Coverage"></a>
15
+ <a href="https://github.com/Davtax/ParameterRun/blob/main/LICENSE"><img src="https://img.shields.io/pypi/l/parameterrun" alt="License"></a>
16
+ <a href="https://github.com/astral-sh/ruff"><img src="https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json" alt="Ruff"></a>
17
+ <a href="https://mypy-lang.org/"><img src="https://www.mypy-lang.org/static/mypy_badge.svg" alt="Checked with mypy"></a>
18
+ <a href="https://github.com/astral-sh/uv"><img src="https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/uv/main/assets/badge/v0.json" alt="uv"></a>
19
+ </p>
20
+
21
+ **Documentation:** <https://davtax.github.io/ParameterRun/>
22
+
23
+ <!-- --8<-- [start:intro] -->
3
24
  `parameterrun` is a lightweight utility for running parameter sweeps in Python with a simple, function-based API.
4
25
 
5
26
  It is designed for scientific and numerical workflows where you want to evaluate a function over one or more parameter
@@ -14,7 +35,9 @@ The package supports:
14
35
  - MPI execution with `mpi4py`
15
36
  - automatic reshaping of outputs into arrays
16
37
  - functions returning either one output or multiple outputs
38
+ <!-- --8<-- [end:intro] -->
17
39
 
40
+ <!-- --8<-- [start:install] -->
18
41
  ## Installation
19
42
 
20
43
  ### With `pip`
@@ -29,6 +52,9 @@ pip install parameterrun
29
52
  pip install parameterrun[mpi]
30
53
  ```
31
54
 
55
+ <!-- --8<-- [end:install] -->
56
+
57
+ <!-- --8<-- [start:idea] -->
32
58
  ## Basic idea
33
59
 
34
60
  The main entry point is:
@@ -41,6 +67,9 @@ The function `parameterrun(...)` evaluates a user-defined function over a set of
41
67
  sweep are identified by their names exactly as they appear in the target function signature. Additional fixed arguments
42
68
  can be passed as keyword arguments.
43
69
 
70
+ <!-- --8<-- [end:idea] -->
71
+
72
+ <!-- --8<-- [start:quickstart] -->
44
73
  ## Quick start
45
74
 
46
75
  ### 1. Single parameter
@@ -96,6 +125,9 @@ print(result.shape) # (2, 3)
96
125
 
97
126
  This grouped-input mode is useful when some parameters are logically linked and should not be combined independently.
98
127
 
128
+ <!-- --8<-- [end:quickstart] -->
129
+
130
+ <!-- --8<-- [start:outputs] -->
99
131
  ## Multiple outputs
100
132
 
101
133
  If the target function returns a tuple, parameterrun returns a list of arrays, one per output channel.
@@ -136,6 +168,9 @@ If `fun` returns `None` for some points (for example, a failed solver), a `Runti
136
168
  the parameters of the first one, because the result is then no longer a numeric array. Returning a NaN array of the
137
169
  right shape for failed points keeps the result numeric.
138
170
 
171
+ <!-- --8<-- [end:outputs] -->
172
+
173
+ <!-- --8<-- [start:errors] -->
139
174
  ## Errors in the function
140
175
 
141
176
  `on_error` controls what happens when `fun` raises an exception at some point:
@@ -155,6 +190,9 @@ result = parameterrun(my_function, param_names="x", param_values=[1, 2, 3], on_e
155
190
 
156
191
  Only `Exception` subclasses are caught: `KeyboardInterrupt` and `SystemExit` always propagate.
157
192
 
193
+ <!-- --8<-- [end:errors] -->
194
+
195
+ <!-- --8<-- [start:validation] -->
158
196
  ## Validation behavior
159
197
 
160
198
  `parameterrun` validates inputs before launching workers and raises clear `ValueError`s when:
@@ -164,6 +202,9 @@ Only `Exception` subclasses are caught: `KeyboardInterrupt` and `SystemExit` alw
164
202
  - extra keyword arguments do not match the target function signature
165
203
  - a keyword argument conflicts with a swept parameter name
166
204
 
205
+ <!-- --8<-- [end:validation] -->
206
+
207
+ <!-- --8<-- [start:backends] -->
167
208
  ## Parallel backend
168
209
 
169
210
  `parameterrun` supports two execution backends:
@@ -244,6 +285,9 @@ result = parameterrun(my_function, param_names="x", param_values=[1, 2, 3], back
244
285
 
245
286
  If rank 0 fails while finishing the result (for example with `reshape="strict"`), every rank raises instead of waiting.
246
287
 
288
+ <!-- --8<-- [end:backends] -->
289
+
290
+ <!-- --8<-- [start:saving] -->
247
291
  ## Saving the result to a file
248
292
 
249
293
  `result_file` writes the result, reshaped to the grid, to a `.npy` file on rank 0. With several outputs there is one
@@ -264,6 +308,9 @@ data = np.load("sweep.npy") # Same as result
264
308
  `RuntimeWarning`. String outputs are written as a NumPy string array.
265
309
  - The directory is checked before anything is computed.
266
310
 
311
+ <!-- --8<-- [end:saving] -->
312
+
313
+ <!-- --8<-- [start:checkpoints] -->
267
314
  ## Checkpoints for long runs
268
315
 
269
316
  `checkpoint` saves the finished points of a long run to a directory, so that a run killed by a crash, a node failure or
@@ -307,6 +354,9 @@ result = parameterrun(my_function, param_names=["x", "y"], param_values=[xs, ys]
307
354
  the previous snapshot. Numeric outputs are stored as plain arrays, read without pickle. Only non-numeric outputs
308
355
  (strings, dicts, ragged arrays, ...) are pickled: load such snapshots only from sources you trust.
309
356
 
357
+ <!-- --8<-- [end:checkpoints] -->
358
+
359
+ <!-- --8<-- [start:progress] -->
310
360
  ## Progress bars and verbosity
311
361
 
312
362
  By default (`pbar_bool=None`), the progress bar is shown when the output is a terminal or a Jupyter notebook, and hidden
@@ -329,6 +379,9 @@ result = parameterrun(my_function, param_names="x", param_values=[1, 2, 3], verb
329
379
  The progress-bar description is generated automatically from the function name and parameter names, unless you provide
330
380
  `desc` explicitly.
331
381
 
382
+ <!-- --8<-- [end:progress] -->
383
+
384
+ <!-- --8<-- [start:api] -->
332
385
  ## API reference
333
386
 
334
387
  `parameterrun`
@@ -365,6 +418,9 @@ parameterrun(fun, param_names, param_values, n_workers=-1, pbar_bool=None, pbar_
365
418
  * `keep_checkpoint`: keep the snapshot after success (default `True`)
366
419
  * `**kwargs`: extra fixed keyword arguments forwarded to `fun`. They cannot reuse the names of the parameters above.
367
420
 
421
+ <!-- --8<-- [end:api] -->
422
+
423
+ <!-- --8<-- [start:inputs] -->
368
424
  ## Input formats
369
425
 
370
426
  `parameterrun` accepts three input styles.
@@ -393,6 +449,9 @@ param_names = [["x", "y"], ["z"]]
393
449
  param_values = [[[1, 2], [10, 20]], [[100, 200, 300]], ]
394
450
  ```
395
451
 
452
+ <!-- --8<-- [end:inputs] -->
453
+
454
+ <!-- --8<-- [start:devchecks] -->
396
455
  ## Development checks
397
456
 
398
457
  Before opening a PR or publishing a release, run:
@@ -412,3 +471,4 @@ uv sync --extra mpi
412
471
  mpirun -n 4 uv run pytest -m mpi -o addopts="-q -m mpi"
413
472
  ```
414
473
 
474
+ <!-- --8<-- [end:devchecks] -->
@@ -0,0 +1,33 @@
1
+ /* Brand colours from the logo (logo/logos.af). */
2
+ :root,
3
+ [data-md-color-scheme="default"] {
4
+ --md-primary-fg-color: #1c1c1e;
5
+ --md-primary-fg-color--light: #3a3a3c;
6
+ --md-primary-fg-color--dark: #000000;
7
+ --md-accent-fg-color: #0a84ff;
8
+ --md-typeset-a-color: #0a84ff;
9
+ }
10
+
11
+ [data-md-color-scheme="slate"] {
12
+ --md-primary-fg-color: #1c1c1e;
13
+ --md-primary-fg-color--light: #3a3a3c;
14
+ --md-primary-fg-color--dark: #000000;
15
+ --md-accent-fg-color: #409cff;
16
+ --md-typeset-a-color: #409cff;
17
+ --md-default-bg-color: #111113;
18
+ }
19
+
20
+ .md-header__button.md-logo img {
21
+ height: 1.6rem;
22
+ }
23
+
24
+ .pr-hero {
25
+ display: block;
26
+ max-width: 520px;
27
+ margin: 1rem auto 2rem;
28
+ }
29
+
30
+ /* Header logo: single-colour mark, dark on the light theme, light on the dark theme. */
31
+ [data-md-color-scheme="slate"] .md-header__button.md-logo img {
32
+ content: url("logo-mark-light.svg");
33
+ }
@@ -0,0 +1,13 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32">
2
+ <style>
3
+ .ink { fill: #1c1c1e; }
4
+ @media (prefers-color-scheme: dark) { .ink { fill: #f5f5f7; } }
5
+ </style>
6
+ <path class="ink" fill-opacity="0.28" d="M4.5 3H25.5A3.5 3.5 0 0 1 25.5 10H4.5Z"/>
7
+ <path class="ink" fill-opacity="0.28" d="M4.5 12.5H25.5A3.5 3.5 0 0 1 25.5 19.5H4.5Z"/>
8
+ <path class="ink" fill-opacity="0.28" d="M4.5 22H25.5A3.5 3.5 0 0 1 25.5 29H4.5Z"/>
9
+ <path class="ink" d="M4.5 3H25.5A3.5 3.5 0 0 1 25.5 10H4.5Z"/>
10
+ <path class="ink" d="M4.5 12.5H18.5A3.5 3.5 0 0 1 18.5 19.5H4.5Z"/>
11
+ <path class="ink" d="M4.5 22H11.5A3.5 3.5 0 0 1 11.5 29H4.5Z"/>
12
+ <rect class="ink" x="1" y="3" width="7" height="26" rx="3.5"/>
13
+ </svg>
@@ -0,0 +1,9 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32">
2
+ <path fill="#1c1c1e" fill-opacity="0.28" d="M4.5 3H25.5A3.5 3.5 0 0 1 25.5 10H4.5Z"/>
3
+ <path fill="#1c1c1e" fill-opacity="0.28" d="M4.5 12.5H25.5A3.5 3.5 0 0 1 25.5 19.5H4.5Z"/>
4
+ <path fill="#1c1c1e" fill-opacity="0.28" d="M4.5 22H25.5A3.5 3.5 0 0 1 25.5 29H4.5Z"/>
5
+ <path fill="#1c1c1e" d="M4.5 3H25.5A3.5 3.5 0 0 1 25.5 10H4.5Z"/>
6
+ <path fill="#1c1c1e" d="M4.5 12.5H18.5A3.5 3.5 0 0 1 18.5 19.5H4.5Z"/>
7
+ <path fill="#1c1c1e" d="M4.5 22H11.5A3.5 3.5 0 0 1 11.5 29H4.5Z"/>
8
+ <rect fill="#1c1c1e" x="1" y="3" width="7" height="26" rx="3.5"/>
9
+ </svg>
@@ -0,0 +1,9 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32">
2
+ <path fill="#f5f5f7" fill-opacity="0.28" d="M4.5 3H25.5A3.5 3.5 0 0 1 25.5 10H4.5Z"/>
3
+ <path fill="#f5f5f7" fill-opacity="0.28" d="M4.5 12.5H25.5A3.5 3.5 0 0 1 25.5 19.5H4.5Z"/>
4
+ <path fill="#f5f5f7" fill-opacity="0.28" d="M4.5 22H25.5A3.5 3.5 0 0 1 25.5 29H4.5Z"/>
5
+ <path fill="#f5f5f7" d="M4.5 3H25.5A3.5 3.5 0 0 1 25.5 10H4.5Z"/>
6
+ <path fill="#f5f5f7" d="M4.5 12.5H18.5A3.5 3.5 0 0 1 18.5 19.5H4.5Z"/>
7
+ <path fill="#f5f5f7" d="M4.5 22H11.5A3.5 3.5 0 0 1 11.5 29H4.5Z"/>
8
+ <rect fill="#f5f5f7" x="1" y="3" width="7" height="26" rx="3.5"/>
9
+ </svg>
@@ -0,0 +1 @@
1
+ <?xml version="1.0" encoding="UTF-8" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg width="730" height="206" viewBox="325 821 3042 858" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:affinity="https://www.affinity.studio/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;"><rect id="Logo---horizontal-dark" affinity:id="Logo – horizontal dark" x="0" y="0" width="3750" height="2500" style="fill:none;"/><g id="Logo---horizontal-dark1" affinity:id="Logo – horizontal dark"><path d="M379.167,829.167l670.833,0c25.314,0 45.833,20.52 45.833,45.833c0,25.314 -20.52,45.833 -45.833,45.833l-670.833,0l0,-91.667Z" style="fill:#2c2c2e;"/><path d="M379.167,829.167l579.167,0c25.314,0 45.833,20.52 45.833,45.833c0,25.314 -20.52,45.833 -45.833,45.833l-579.167,0l0,-91.667Z" style="fill:#409cff;"/><path d="M1239.75,875c0,18.226 -14.774,33 -33,33c-18.226,0 -33,-14.774 -33,-33c0,-18.226 14.774,-33 33,-33c18.226,0 33,14.774 33,33Z" style="fill:#409cff;"/><path d="M379.167,979.167l670.833,0c25.314,0 45.833,20.52 45.833,45.833c0,25.314 -20.52,45.833 -45.833,45.833l-670.833,0l0,-91.667Z" style="fill:#2c2c2e;"/><path d="M379.167,979.167l670.833,0c25.314,0 45.833,20.52 45.833,45.833c0,25.314 -20.52,45.833 -45.833,45.833l-670.833,0l0,-91.667Z" style="fill:#40c8f0;"/><path d="M1239.75,1025c0,18.226 -14.774,33 -33,33c-18.226,0 -33,-14.774 -33,-33c0,-18.226 14.774,-33 33,-33c18.226,0 33,14.774 33,33Z" style="fill:#40c8f0;"/><path d="M379.167,1129.167l670.833,0c25.314,0 45.833,20.52 45.833,45.833c0,25.314 -20.52,45.833 -45.833,45.833l-670.833,0l0,-91.667Z" style="fill:#2c2c2e;"/><path d="M379.167,1129.167l579.167,0c25.314,0 45.833,20.52 45.833,45.833c0,25.314 -20.52,45.833 -45.833,45.833l-579.167,0l0,-91.667Z" style="fill:#5ee0c8;"/><path d="M1239.75,1175c0,18.226 -14.774,33 -33,33c-18.226,0 -33,-14.774 -33,-33c0,-18.226 14.774,-33 33,-33c18.226,0 33,14.774 33,33Z" style="fill:#5ee0c8;"/><path d="M379.167,1279.167l670.833,0c25.314,0 45.833,20.52 45.833,45.833c0,25.314 -20.52,45.833 -45.833,45.833l-670.833,0l0,-91.667Z" style="fill:#2c2c2e;"/><path d="M379.167,1279.167l337.5,0c25.314,0 45.833,20.52 45.833,45.833c0,25.314 -20.52,45.833 -45.833,45.833l-337.5,0l0,-91.667Z" style="fill:#5edc9e;"/><path d="M379.167,1429.167l670.833,0c25.314,0 45.833,20.52 45.833,45.833c0,25.314 -20.52,45.833 -45.833,45.833l-670.833,0l0,-91.667Z" style="fill:#2c2c2e;"/><path d="M379.167,1429.167l212.5,0c25.314,0 45.833,20.52 45.833,45.833c0,25.314 -20.52,45.833 -45.833,45.833l-212.5,0l0,-91.667Z" style="fill:#b4e05a;"/><path d="M379.167,1579.167l670.833,0c25.314,0 45.833,20.52 45.833,45.833c0,25.314 -20.52,45.833 -45.833,45.833l-670.833,0l0,-91.667Z" style="fill:#2c2c2e;"/><path d="M379.167,1579.167l120.833,0c25.314,0 45.833,20.52 45.833,45.833c0,25.314 -20.52,45.833 -45.833,45.833l-120.833,0l0,-91.667Z" style="fill:#ffc94d;"/><path d="M379.167,829.167c25.314,0 45.833,20.52 45.833,45.833l0,750c0,25.314 -20.52,45.833 -45.833,45.833c-25.314,0 -45.833,-20.52 -45.833,-45.833l0,-750c0,-25.314 20.52,-45.833 45.833,-45.833Z" style="fill:#f5f5f7;"/><g><path d="M1369.434,1293.896l-0.684,0l0,111.597l-15.723,0l0,-255.493l15.723,0l0,36.06l0.684,0c6.266,-12.874 15.238,-22.815 26.917,-29.822c11.678,-7.007 24.524,-10.51 38.538,-10.51c22.217,0 39.563,7.662 52.039,22.986c12.476,15.324 18.713,36.145 18.713,62.463c0,29.281 -7.149,52.95 -21.448,71.008c-14.299,18.058 -33.183,27.087 -56.653,27.087c-26.204,0 -45.573,-11.792 -58.105,-35.376Zm-0.684,-65.112l0,22.046c0,17.546 5.526,32.613 16.577,45.203c11.051,12.59 25.578,18.884 43.579,18.884c17.887,0 32.414,-7.662 43.579,-22.986c11.165,-15.324 16.748,-35.461 16.748,-60.413c0,-21.875 -5.127,-39.25 -15.381,-52.124c-10.254,-12.874 -23.926,-19.312 -41.016,-19.312c-20.394,0 -36.174,6.836 -47.339,20.508c-11.165,13.672 -16.748,29.736 -16.748,48.193Z" style="fill:#f5f5f7;fill-rule:nonzero;"/><path d="M1653.638,1325l0,-35.034l-0.684,0c-5.583,11.963 -13.7,21.505 -24.353,28.625c-10.653,7.121 -22.473,10.681 -35.461,10.681c-16.634,0 -29.793,-4.671 -39.478,-14.014c-9.684,-9.342 -14.526,-21.134 -14.526,-35.376c0,-30.534 20.223,-48.991 60.669,-55.371l53.833,-8.032c0,-37.598 -14.128,-56.396 -42.383,-56.396c-19.255,0 -37.996,7.747 -56.226,23.242l0,-18.97c6.494,-5.127 15.295,-9.513 26.404,-13.159c11.108,-3.646 21.562,-5.469 31.36,-5.469c18.001,0 31.93,5.583 41.785,16.748c9.855,11.165 14.783,27.401 14.783,48.706l0,113.818l-15.723,0Zm-48.193,-87.158c-18.343,2.62 -31.217,6.864 -38.623,12.732c-7.406,5.868 -11.108,15.409 -11.108,28.625c0,10.368 3.446,18.913 10.339,25.635c6.893,6.722 16.492,10.083 28.796,10.083c16.862,0 30.876,-6.238 42.041,-18.713c11.165,-12.476 16.748,-28.569 16.748,-48.279l0,-17.09l-48.193,7.007Z" style="fill:#f5f5f7;fill-rule:nonzero;"/><path d="M1804.541,1166.406c-5.241,-3.76 -11.393,-5.64 -18.457,-5.64c-13.786,0 -25.35,7.121 -34.692,21.362c-9.342,14.242 -14.014,34.465 -14.014,60.669l0,82.202l-15.381,0l0,-175l15.381,0l0,38.794l0.684,0c3.988,-13.33 10.311,-23.698 18.97,-31.104c8.659,-7.406 18.685,-11.108 30.078,-11.108c6.494,0 12.305,1.025 17.432,3.076l0,16.748Z" style="fill:#f5f5f7;fill-rule:nonzero;"/><path d="M1942.114,1325l0,-35.034l-0.684,0c-5.583,11.963 -13.7,21.505 -24.353,28.625c-10.653,7.121 -22.473,10.681 -35.461,10.681c-16.634,0 -29.793,-4.671 -39.478,-14.014c-9.684,-9.342 -14.526,-21.134 -14.526,-35.376c0,-30.534 20.223,-48.991 60.669,-55.371l53.833,-8.032c0,-37.598 -14.128,-56.396 -42.383,-56.396c-19.255,0 -37.996,7.747 -56.226,23.242l0,-18.97c6.494,-5.127 15.295,-9.513 26.404,-13.159c11.108,-3.646 21.562,-5.469 31.36,-5.469c18.001,0 31.93,5.583 41.785,16.748c9.855,11.165 14.783,27.401 14.783,48.706l0,113.818l-15.723,0Zm-48.193,-87.158c-18.343,2.62 -31.217,6.864 -38.623,12.732c-7.406,5.868 -11.108,15.409 -11.108,28.625c0,10.368 3.446,18.913 10.339,25.635c6.893,6.722 16.492,10.083 28.796,10.083c16.862,0 30.876,-6.238 42.041,-18.713c11.165,-12.476 16.748,-28.569 16.748,-48.279l0,-17.09l-48.193,7.007Z" style="fill:#f5f5f7;fill-rule:nonzero;"/><path d="M2229.907,1325l0,-105.273c0,-21.989 -3.446,-37.427 -10.339,-46.313c-6.893,-8.887 -17.802,-13.33 -32.727,-13.33c-13.786,0 -25.692,5.924 -35.718,17.773c-10.026,11.849 -15.039,26.717 -15.039,44.604l0,102.539l-15.723,0l0,-106.47c0,-38.965 -14.811,-58.447 -44.434,-58.447c-14.242,0 -26.09,5.953 -35.547,17.859c-9.456,11.906 -14.185,27.315 -14.185,46.228l0,100.83l-15.723,0l0,-175l15.723,0l0,29.053l0.684,0c12.191,-22.217 30.021,-33.325 53.491,-33.325c12.76,0 23.669,3.674 32.727,11.023c9.058,7.349 15.181,17.004 18.372,28.967c5.469,-12.646 13.302,-22.473 23.499,-29.48c10.197,-7.007 21.277,-10.51 33.24,-10.51c38.281,0 57.422,23.698 57.422,71.094l0,108.179l-15.723,0Z" style="fill:#f5f5f7;fill-rule:nonzero;"/><path d="M2301.855,1238.184c0,24.04 5.554,42.839 16.663,56.396c11.108,13.558 26.347,20.337 45.715,20.337c19.596,0 38.737,-7.235 57.422,-21.704l0,16.748c-18.115,12.874 -38.338,19.312 -60.669,19.312c-22.559,0 -40.788,-8.089 -54.688,-24.268c-13.9,-16.178 -20.85,-39.022 -20.85,-68.53c0,-25.521 7.263,-47.026 21.79,-64.514c14.526,-17.489 33.411,-26.233 56.653,-26.233c21.761,0 38.452,7.633 50.073,22.9c11.621,15.267 17.432,36.117 17.432,62.549l0,7.007l-129.541,0Zm113.135,-14.355c-0.684,-20.166 -5.526,-35.832 -14.526,-46.997c-9.001,-11.165 -21.419,-16.748 -37.256,-16.748c-16.406,0 -29.993,5.497 -40.759,16.492c-10.767,10.994 -17.403,26.746 -19.91,47.253l112.451,0Z" style="fill:#f5f5f7;fill-rule:nonzero;"/><path d="M2544.019,1322.607c-8.203,3.874 -15.894,5.811 -23.071,5.811c-25.863,0 -38.794,-15.495 -38.794,-46.484l0,-117.578l-31.445,0l0,-14.355l31.445,0l0,-45.459c2.507,-0.911 5.127,-1.823 7.861,-2.734c2.734,-0.798 5.355,-1.652 7.861,-2.563l0,50.757l46.143,0l0,14.355l-46.143,0l0,115.527c0,12.077 1.908,20.821 5.725,26.233c3.817,5.412 10.282,8.118 19.397,8.118c6.494,0 13.501,-2.108 21.021,-6.323l0,14.697Z" style="fill:#f5f5f7;fill-rule:nonzero;"/><path d="M2582.471,1238.184c0,24.04 5.554,42.839 16.663,56.396c11.108,13.558 26.347,20.337 45.715,20.337c19.596,0 38.737,-7.235 57.422,-21.704l0,16.748c-18.115,12.874 -38.338,19.312 -60.669,19.312c-22.559,0 -40.788,-8.089 -54.688,-24.268c-13.9,-16.178 -20.85,-39.022 -20.85,-68.53c0,-25.521 7.263,-47.026 21.79,-64.514c14.526,-17.489 33.411,-26.233 56.653,-26.233c21.761,0 38.452,7.633 50.073,22.9c11.621,15.267 17.432,36.117 17.432,62.549l0,7.007l-129.541,0Zm113.135,-14.355c-0.684,-20.166 -5.526,-35.832 -14.526,-46.997c-9.001,-11.165 -21.419,-16.748 -37.256,-16.748c-16.406,0 -29.993,5.497 -40.759,16.492c-10.767,10.994 -17.403,26.746 -19.91,47.253l112.451,0Z" style="fill:#f5f5f7;fill-rule:nonzero;"/><path d="M2837.964,1166.406c-5.241,-3.76 -11.393,-5.64 -18.457,-5.64c-13.786,0 -25.35,7.121 -34.692,21.362c-9.342,14.242 -14.014,34.465 -14.014,60.669l0,82.202l-15.381,0l0,-175l15.381,0l0,38.794l0.684,0c3.988,-13.33 10.311,-23.698 18.97,-31.104c8.659,-7.406 18.685,-11.108 30.078,-11.108c6.494,0 12.305,1.025 17.432,3.076l0,16.748Z" style="fill:#f5f5f7;fill-rule:nonzero;"/><path d="M2970.239,1187.769c-4.785,-3.76 -11.678,-5.64 -20.679,-5.64c-11.735,0 -21.533,5.298 -29.395,15.894c-7.861,10.596 -11.792,25.008 -11.792,43.237l0,83.74l-39.648,0l0,-175l39.648,0l0,36.06l0.684,0c3.874,-12.305 9.827,-21.903 17.859,-28.796c8.032,-6.893 17.004,-10.339 26.917,-10.339c7.178,0 12.646,1.082 16.406,3.247l0,37.598Z" style="fill:#409cff;fill-rule:nonzero;"/><path d="M3150.879,1325l-39.648,0l0,-27.686l-0.684,0c-11.507,21.191 -29.395,31.787 -53.662,31.787c-41.357,0 -62.036,-24.837 -62.036,-74.512l0,-104.59l39.648,0l0,100.488c0,31.445 12.134,47.168 36.401,47.168c11.735,0 21.391,-4.329 28.967,-12.988c7.576,-8.659 11.365,-19.995 11.365,-34.009l0,-100.659l39.648,0l0,175Z" style="fill:#409cff;fill-rule:nonzero;"/><path d="M3358.35,1325l-39.648,0l0,-98.608c0,-32.699 -11.564,-49.048 -34.692,-49.048c-12.077,0 -22.046,4.529 -29.907,13.586c-7.861,9.058 -11.792,20.479 -11.792,34.265l0,99.805l-39.819,0l0,-175l39.819,0l0,29.053l0.684,0c13.102,-22.103 32.015,-33.154 56.738,-33.154c19.027,0 33.553,6.181 43.579,18.542c10.026,12.362 15.039,30.221 15.039,53.577l0,106.982Z" style="fill:#409cff;fill-rule:nonzero;"/></g><g><path d="M1357.601,1509.074l0,24.259l-7.52,0l0,-64.185l17.635,0c6.863,0 12.182,1.671 15.957,5.013c3.775,3.342 5.662,8.057 5.662,14.144c0,6.087 -2.096,11.07 -6.289,14.95c-4.192,3.879 -9.854,5.819 -16.986,5.819l-8.459,0Zm0,-33.122l0,26.318l7.878,0c5.192,0 9.153,-1.186 11.884,-3.558c2.73,-2.372 4.095,-5.722 4.095,-10.048c0,-8.474 -5.013,-12.712 -15.039,-12.712l-8.818,0Z" style="fill:#8e8e93;fill-rule:nonzero;"/><path d="M1430.111,1533.333l-7.34,0l0,-7.161l-0.179,0c-3.193,5.49 -7.893,8.236 -14.099,8.236c-4.565,0 -8.139,-1.208 -10.72,-3.625c-2.581,-2.417 -3.872,-5.625 -3.872,-9.623c0,-8.564 5.043,-13.547 15.129,-14.95l13.741,-1.925c0,-7.788 -3.148,-11.682 -9.444,-11.682c-5.52,0 -10.503,1.88 -14.95,5.64l0,-7.52c4.506,-2.865 9.698,-4.297 15.576,-4.297c10.772,0 16.158,5.699 16.158,17.098l0,29.81Zm-7.34,-23.185l-11.056,1.522c-3.402,0.477 -5.968,1.32 -7.699,2.529c-1.731,1.208 -2.596,3.349 -2.596,6.423c0,2.238 0.798,4.066 2.395,5.483c1.596,1.417 3.722,2.126 6.378,2.126c3.64,0 6.647,-1.276 9.019,-3.827c2.372,-2.551 3.558,-5.781 3.558,-9.69l0,-4.565Z" style="fill:#8e8e93;fill-rule:nonzero;"/><path d="M1467.843,1494.93c-1.283,-0.985 -3.133,-1.477 -5.55,-1.477c-3.133,0 -5.752,1.477 -7.855,4.431c-2.104,2.954 -3.156,6.982 -3.156,12.085l0,23.364l-7.34,0l0,-45.833l7.34,0l0,9.444l0.179,0c1.044,-3.223 2.641,-5.737 4.789,-7.542c2.148,-1.805 4.551,-2.708 7.206,-2.708c1.91,0 3.372,0.209 4.386,0.627l0,7.609Z" style="fill:#8e8e93;fill-rule:nonzero;"/><path d="M1508.618,1533.333l-7.34,0l0,-7.161l-0.179,0c-3.193,5.49 -7.893,8.236 -14.099,8.236c-4.565,0 -8.139,-1.208 -10.72,-3.625c-2.581,-2.417 -3.872,-5.625 -3.872,-9.623c0,-8.564 5.043,-13.547 15.129,-14.95l13.741,-1.925c0,-7.788 -3.148,-11.682 -9.444,-11.682c-5.52,0 -10.503,1.88 -14.95,5.64l0,-7.52c4.506,-2.865 9.698,-4.297 15.576,-4.297c10.772,0 16.158,5.699 16.158,17.098l0,29.81Zm-7.34,-23.185l-11.056,1.522c-3.402,0.477 -5.968,1.32 -7.699,2.529c-1.731,1.208 -2.596,3.349 -2.596,6.423c0,2.238 0.798,4.066 2.395,5.483c1.596,1.417 3.722,2.126 6.378,2.126c3.64,0 6.647,-1.276 9.019,-3.827c2.372,-2.551 3.558,-5.781 3.558,-9.69l0,-4.565Z" style="fill:#8e8e93;fill-rule:nonzero;"/><rect x="1522.449" y="1465.479" width="7.34" height="67.855" style="fill:#8e8e93;fill-rule:nonzero;"/><rect x="1544.649" y="1465.479" width="7.34" height="67.855" style="fill:#8e8e93;fill-rule:nonzero;"/><path d="M1603.687,1512.252l-32.361,0c0.119,5.103 1.492,9.041 4.118,11.816c2.626,2.775 6.236,4.163 10.832,4.163c5.162,0 9.907,-1.701 14.233,-5.103l0,6.893c-4.028,2.924 -9.355,4.386 -15.979,4.386c-6.475,0 -11.563,-2.081 -15.263,-6.244c-3.7,-4.163 -5.55,-10.019 -5.55,-17.568c0,-7.132 2.022,-12.943 6.065,-17.434c4.043,-4.491 9.064,-6.736 15.061,-6.736c5.998,0 10.638,1.94 13.92,5.819c3.282,3.879 4.924,9.265 4.924,16.158l0,3.849Zm-7.52,-6.222c-0.03,-4.237 -1.052,-7.534 -3.066,-9.892c-2.014,-2.357 -4.812,-3.536 -8.392,-3.536c-3.461,0 -6.401,1.238 -8.818,3.715c-2.417,2.477 -3.909,5.714 -4.476,9.713l24.752,0Z" style="fill:#8e8e93;fill-rule:nonzero;"/><rect x="1614.787" y="1465.479" width="7.34" height="67.855" style="fill:#8e8e93;fill-rule:nonzero;"/><path d="M1669.617,1526.709l-0.179,0l0,27.706l-7.34,0l0,-66.915l7.34,0l0,8.057l0.179,0c3.611,-6.087 8.892,-9.131 15.845,-9.131c5.908,0 10.518,2.051 13.831,6.154c3.312,4.103 4.968,9.601 4.968,16.494c0,7.669 -1.865,13.808 -5.595,18.418c-3.73,4.61 -8.832,6.915 -15.308,6.915c-5.938,0 -10.518,-2.566 -13.741,-7.699Zm-0.179,-18.486l0,6.401c0,3.79 1.231,7.005 3.693,9.646c2.462,2.641 5.587,3.961 9.377,3.961c4.446,0 7.93,-1.701 10.451,-5.103c2.521,-3.402 3.782,-8.131 3.782,-14.189c0,-5.103 -1.179,-9.101 -3.536,-11.995c-2.357,-2.894 -5.55,-4.342 -9.578,-4.342c-4.267,0 -7.699,1.485 -10.295,4.454c-2.596,2.969 -3.894,6.691 -3.894,11.167Z" style="fill:#8e8e93;fill-rule:nonzero;"/><path d="M1748.796,1533.333l-7.34,0l0,-7.161l-0.179,0c-3.193,5.49 -7.893,8.236 -14.099,8.236c-4.565,0 -8.139,-1.208 -10.72,-3.625c-2.581,-2.417 -3.872,-5.625 -3.872,-9.623c0,-8.564 5.043,-13.547 15.129,-14.95l13.741,-1.925c0,-7.788 -3.148,-11.682 -9.444,-11.682c-5.52,0 -10.503,1.88 -14.95,5.64l0,-7.52c4.506,-2.865 9.698,-4.297 15.576,-4.297c10.772,0 16.158,5.699 16.158,17.098l0,29.81Zm-7.34,-23.185l-11.056,1.522c-3.402,0.477 -5.968,1.32 -7.699,2.529c-1.731,1.208 -2.596,3.349 -2.596,6.423c0,2.238 0.798,4.066 2.395,5.483c1.596,1.417 3.722,2.126 6.378,2.126c3.64,0 6.647,-1.276 9.019,-3.827c2.372,-2.551 3.558,-5.781 3.558,-9.69l0,-4.565Z" style="fill:#8e8e93;fill-rule:nonzero;"/><path d="M1786.528,1494.93c-1.283,-0.985 -3.133,-1.477 -5.55,-1.477c-3.133,0 -5.752,1.477 -7.855,4.431c-2.104,2.954 -3.156,6.982 -3.156,12.085l0,23.364l-7.34,0l0,-45.833l7.34,0l0,9.444l0.179,0c1.044,-3.223 2.641,-5.737 4.789,-7.542c2.148,-1.805 4.551,-2.708 7.206,-2.708c1.91,0 3.372,0.209 4.386,0.627l0,7.609Z" style="fill:#8e8e93;fill-rule:nonzero;"/><path d="M1827.303,1533.333l-7.34,0l0,-7.161l-0.179,0c-3.193,5.49 -7.893,8.236 -14.099,8.236c-4.565,0 -8.139,-1.208 -10.72,-3.625c-2.581,-2.417 -3.872,-5.625 -3.872,-9.623c0,-8.564 5.043,-13.547 15.129,-14.95l13.741,-1.925c0,-7.788 -3.148,-11.682 -9.444,-11.682c-5.52,0 -10.503,1.88 -14.95,5.64l0,-7.52c4.506,-2.865 9.698,-4.297 15.576,-4.297c10.772,0 16.158,5.699 16.158,17.098l0,29.81Zm-7.34,-23.185l-11.056,1.522c-3.402,0.477 -5.968,1.32 -7.699,2.529c-1.731,1.208 -2.596,3.349 -2.596,6.423c0,2.238 0.798,4.066 2.395,5.483c1.596,1.417 3.722,2.126 6.378,2.126c3.64,0 6.647,-1.276 9.019,-3.827c2.372,-2.551 3.558,-5.781 3.558,-9.69l0,-4.565Z" style="fill:#8e8e93;fill-rule:nonzero;"/><path d="M1906.213,1533.333l-7.34,0l0,-26.318c0,-5.073 -0.783,-8.743 -2.35,-11.011c-1.567,-2.268 -4.2,-3.402 -7.9,-3.402c-3.133,0 -5.796,1.432 -7.99,4.297c-2.193,2.865 -3.29,6.296 -3.29,10.295l0,26.139l-7.34,0l0,-27.214c0,-9.012 -3.476,-13.517 -10.429,-13.517c-3.223,0 -5.878,1.35 -7.967,4.051c-2.089,2.7 -3.133,6.214 -3.133,10.541l0,26.139l-7.34,0l0,-45.833l7.34,0l0,7.251l0.179,0c3.252,-5.55 7.997,-8.325 14.233,-8.325c3.133,0 5.863,0.873 8.191,2.618c2.327,1.746 3.924,4.036 4.789,6.871c3.402,-6.326 8.474,-9.489 15.218,-9.489c10.086,0 15.129,6.222 15.129,18.665l0,28.243Z" style="fill:#8e8e93;fill-rule:nonzero;"/><path d="M1956.925,1512.252l-32.361,0c0.119,5.103 1.492,9.041 4.118,11.816c2.626,2.775 6.236,4.163 10.832,4.163c5.162,0 9.907,-1.701 14.233,-5.103l0,6.893c-4.028,2.924 -9.355,4.386 -15.979,4.386c-6.475,0 -11.563,-2.081 -15.263,-6.244c-3.7,-4.163 -5.55,-10.019 -5.55,-17.568c0,-7.132 2.022,-12.943 6.065,-17.434c4.043,-4.491 9.064,-6.736 15.061,-6.736c5.998,0 10.638,1.94 13.92,5.819c3.282,3.879 4.924,9.265 4.924,16.158l0,3.849Zm-7.52,-6.222c-0.03,-4.237 -1.052,-7.534 -3.066,-9.892c-2.014,-2.357 -4.812,-3.536 -8.392,-3.536c-3.461,0 -6.401,1.238 -8.818,3.715c-2.417,2.477 -3.909,5.714 -4.476,9.713l24.752,0Z" style="fill:#8e8e93;fill-rule:nonzero;"/><path d="M1989.286,1532.886c-1.731,0.955 -4.013,1.432 -6.848,1.432c-8.027,0 -12.04,-4.476 -12.04,-13.428l0,-27.124l-7.878,0l0,-6.266l7.878,0l0,-11.19l7.34,-2.372l0,13.562l11.548,0l0,6.266l-11.548,0l0,25.826c0,3.073 0.522,5.267 1.567,6.58c1.044,1.313 2.775,1.969 5.192,1.969c1.85,0 3.446,-0.507 4.789,-1.522l0,6.266Z" style="fill:#8e8e93;fill-rule:nonzero;"/><path d="M2035.925,1512.252l-32.361,0c0.119,5.103 1.492,9.041 4.118,11.816c2.626,2.775 6.236,4.163 10.832,4.163c5.162,0 9.907,-1.701 14.233,-5.103l0,6.893c-4.028,2.924 -9.355,4.386 -15.979,4.386c-6.475,0 -11.563,-2.081 -15.263,-6.244c-3.7,-4.163 -5.55,-10.019 -5.55,-17.568c0,-7.132 2.022,-12.943 6.065,-17.434c4.043,-4.491 9.064,-6.736 15.061,-6.736c5.998,0 10.638,1.94 13.92,5.819c3.282,3.879 4.924,9.265 4.924,16.158l0,3.849Zm-7.52,-6.222c-0.03,-4.237 -1.052,-7.534 -3.066,-9.892c-2.014,-2.357 -4.812,-3.536 -8.392,-3.536c-3.461,0 -6.401,1.238 -8.818,3.715c-2.417,2.477 -3.909,5.714 -4.476,9.713l24.752,0Z" style="fill:#8e8e93;fill-rule:nonzero;"/><path d="M2070.927,1494.93c-1.283,-0.985 -3.133,-1.477 -5.55,-1.477c-3.133,0 -5.752,1.477 -7.855,4.431c-2.104,2.954 -3.156,6.982 -3.156,12.085l0,23.364l-7.34,0l0,-45.833l7.34,0l0,9.444l0.179,0c1.044,-3.223 2.641,-5.737 4.789,-7.542c2.148,-1.805 4.551,-2.708 7.206,-2.708c1.91,0 3.372,0.209 4.386,0.627l0,7.609Z" style="fill:#8e8e93;fill-rule:nonzero;"/><path d="M2101.229,1531.677l0,-7.878c3.998,2.954 8.4,4.431 13.204,4.431c6.445,0 9.668,-2.148 9.668,-6.445c0,-1.223 -0.276,-2.26 -0.828,-3.111c-0.552,-0.85 -1.298,-1.604 -2.238,-2.26c-0.94,-0.656 -2.044,-1.246 -3.312,-1.768c-1.268,-0.522 -2.633,-1.067 -4.095,-1.634c-2.029,-0.806 -3.812,-1.619 -5.349,-2.439c-1.537,-0.821 -2.82,-1.746 -3.849,-2.775c-1.029,-1.029 -1.805,-2.201 -2.327,-3.514c-0.522,-1.313 -0.783,-2.85 -0.783,-4.61c0,-2.148 0.492,-4.051 1.477,-5.707c0.985,-1.656 2.298,-3.044 3.939,-4.163c1.641,-1.119 3.514,-1.962 5.617,-2.529c2.104,-0.567 4.274,-0.85 6.512,-0.85c3.969,0 7.52,0.686 10.653,2.059l0,7.43c-3.372,-2.208 -7.251,-3.312 -11.637,-3.312c-1.373,0 -2.611,0.157 -3.715,0.47c-1.104,0.313 -2.051,0.753 -2.842,1.32c-0.791,0.567 -1.402,1.246 -1.835,2.037c-0.433,0.791 -0.649,1.664 -0.649,2.618c0,1.194 0.216,2.193 0.649,2.999c0.433,0.806 1.067,1.522 1.902,2.148c0.836,0.627 1.85,1.194 3.044,1.701c1.194,0.507 2.551,1.059 4.073,1.656c2.029,0.776 3.849,1.574 5.461,2.395c1.611,0.821 2.984,1.746 4.118,2.775c1.134,1.029 2.007,2.216 2.618,3.558c0.612,1.343 0.918,2.939 0.918,4.789c0,2.268 -0.5,4.237 -1.499,5.908c-1,1.671 -2.335,3.059 -4.006,4.163c-1.671,1.104 -3.596,1.925 -5.774,2.462c-2.178,0.537 -4.461,0.806 -6.848,0.806c-4.715,0 -8.803,-0.91 -12.264,-2.73Z" style="fill:#8e8e93;fill-rule:nonzero;"/><path d="M2200.639,1487.5l-13.741,45.833l-7.609,0l-9.444,-32.808c-0.358,-1.253 -0.597,-2.671 -0.716,-4.252l-0.179,0c-0.09,1.074 -0.403,2.462 -0.94,4.163l-10.25,32.898l-7.34,0l-13.875,-45.833l7.699,0l9.489,34.465c0.298,1.044 0.507,2.417 0.627,4.118l0.358,0c0.09,-1.313 0.358,-2.715 0.806,-4.207l10.563,-34.375l6.714,0l9.489,34.554c0.298,1.104 0.522,2.477 0.671,4.118l0.358,0c0.06,-1.164 0.313,-2.536 0.761,-4.118l9.31,-34.554l7.251,0Z" style="fill:#8e8e93;fill-rule:nonzero;"/><path d="M2245.98,1512.252l-32.361,0c0.119,5.103 1.492,9.041 4.118,11.816c2.626,2.775 6.236,4.163 10.832,4.163c5.162,0 9.907,-1.701 14.233,-5.103l0,6.893c-4.028,2.924 -9.355,4.386 -15.979,4.386c-6.475,0 -11.563,-2.081 -15.263,-6.244c-3.7,-4.163 -5.55,-10.019 -5.55,-17.568c0,-7.132 2.022,-12.943 6.065,-17.434c4.043,-4.491 9.064,-6.736 15.061,-6.736c5.998,0 10.638,1.94 13.92,5.819c3.282,3.879 4.924,9.265 4.924,16.158l0,3.849Zm-7.52,-6.222c-0.03,-4.237 -1.052,-7.534 -3.066,-9.892c-2.014,-2.357 -4.812,-3.536 -8.392,-3.536c-3.461,0 -6.401,1.238 -8.818,3.715c-2.417,2.477 -3.909,5.714 -4.476,9.713l24.752,0Z" style="fill:#8e8e93;fill-rule:nonzero;"/><path d="M2293.917,1512.252l-32.361,0c0.119,5.103 1.492,9.041 4.118,11.816c2.626,2.775 6.236,4.163 10.832,4.163c5.162,0 9.907,-1.701 14.233,-5.103l0,6.893c-4.028,2.924 -9.355,4.386 -15.979,4.386c-6.475,0 -11.563,-2.081 -15.263,-6.244c-3.7,-4.163 -5.55,-10.019 -5.55,-17.568c0,-7.132 2.022,-12.943 6.065,-17.434c4.043,-4.491 9.064,-6.736 15.061,-6.736c5.998,0 10.638,1.94 13.92,5.819c3.282,3.879 4.924,9.265 4.924,16.158l0,3.849Zm-7.52,-6.222c-0.03,-4.237 -1.052,-7.534 -3.066,-9.892c-2.014,-2.357 -4.812,-3.536 -8.392,-3.536c-3.461,0 -6.401,1.238 -8.818,3.715c-2.417,2.477 -3.909,5.714 -4.476,9.713l24.752,0Z" style="fill:#8e8e93;fill-rule:nonzero;"/><path d="M2312.537,1526.709l-0.179,0l0,27.706l-7.34,0l0,-66.915l7.34,0l0,8.057l0.179,0c3.611,-6.087 8.892,-9.131 15.845,-9.131c5.908,0 10.518,2.051 13.831,6.154c3.312,4.103 4.968,9.601 4.968,16.494c0,7.669 -1.865,13.808 -5.595,18.418c-3.73,4.61 -8.832,6.915 -15.308,6.915c-5.938,0 -10.518,-2.566 -13.741,-7.699Zm-0.179,-18.486l0,6.401c0,3.79 1.231,7.005 3.693,9.646c2.462,2.641 5.587,3.961 9.377,3.961c4.446,0 7.93,-1.701 10.451,-5.103c2.521,-3.402 3.782,-8.131 3.782,-14.189c0,-5.103 -1.179,-9.101 -3.536,-11.995c-2.357,-2.894 -5.55,-4.342 -9.578,-4.342c-4.267,0 -7.699,1.485 -10.295,4.454c-2.596,2.969 -3.894,6.691 -3.894,11.167Z" style="fill:#8e8e93;fill-rule:nonzero;"/><path d="M2356.132,1531.677l0,-7.878c3.998,2.954 8.4,4.431 13.204,4.431c6.445,0 9.668,-2.148 9.668,-6.445c0,-1.223 -0.276,-2.26 -0.828,-3.111c-0.552,-0.85 -1.298,-1.604 -2.238,-2.26c-0.94,-0.656 -2.044,-1.246 -3.312,-1.768c-1.268,-0.522 -2.633,-1.067 -4.095,-1.634c-2.029,-0.806 -3.812,-1.619 -5.349,-2.439c-1.537,-0.821 -2.82,-1.746 -3.849,-2.775c-1.029,-1.029 -1.805,-2.201 -2.327,-3.514c-0.522,-1.313 -0.783,-2.85 -0.783,-4.61c0,-2.148 0.492,-4.051 1.477,-5.707c0.985,-1.656 2.298,-3.044 3.939,-4.163c1.641,-1.119 3.514,-1.962 5.617,-2.529c2.104,-0.567 4.274,-0.85 6.512,-0.85c3.969,0 7.52,0.686 10.653,2.059l0,7.43c-3.372,-2.208 -7.251,-3.312 -11.637,-3.312c-1.373,0 -2.611,0.157 -3.715,0.47c-1.104,0.313 -2.051,0.753 -2.842,1.32c-0.791,0.567 -1.402,1.246 -1.835,2.037c-0.433,0.791 -0.649,1.664 -0.649,2.618c0,1.194 0.216,2.193 0.649,2.999c0.433,0.806 1.067,1.522 1.902,2.148c0.836,0.627 1.85,1.194 3.044,1.701c1.194,0.507 2.551,1.059 4.073,1.656c2.029,0.776 3.849,1.574 5.461,2.395c1.611,0.821 2.984,1.746 4.118,2.775c1.134,1.029 2.007,2.216 2.618,3.558c0.612,1.343 0.918,2.939 0.918,4.789c0,2.268 -0.5,4.237 -1.499,5.908c-1,1.671 -2.335,3.059 -4.006,4.163c-1.671,1.104 -3.596,1.925 -5.774,2.462c-2.178,0.537 -4.461,0.806 -6.848,0.806c-4.715,0 -8.803,-0.91 -12.264,-2.73Z" style="fill:#8e8e93;fill-rule:nonzero;"/><path d="M2445.561,1471.924c-1.432,-0.806 -3.059,-1.208 -4.879,-1.208c-5.132,0 -7.699,3.238 -7.699,9.713l0,7.072l10.742,0l0,6.266l-10.742,0l0,39.567l-7.296,0l0,-39.567l-7.833,0l0,-6.266l7.833,0l0,-7.43c0,-4.804 1.388,-8.601 4.163,-11.391c2.775,-2.79 6.236,-4.185 10.384,-4.185c2.238,0 4.013,0.269 5.326,0.806l0,6.624Z" style="fill:#8e8e93;fill-rule:nonzero;"/><path d="M2470.76,1534.408c-6.774,0 -12.182,-2.141 -16.225,-6.423c-4.043,-4.282 -6.065,-9.959 -6.065,-17.031c0,-7.699 2.104,-13.711 6.311,-18.038c4.207,-4.327 9.892,-6.49 17.053,-6.49c6.833,0 12.167,2.104 16.001,6.311c3.834,4.207 5.752,10.041 5.752,17.501c0,7.311 -2.066,13.167 -6.199,17.568c-4.133,4.401 -9.675,6.602 -16.628,6.602Zm0.537,-41.805c-4.715,0 -8.445,1.604 -11.19,4.812c-2.745,3.208 -4.118,7.631 -4.118,13.271c0,5.431 1.388,9.713 4.163,12.846c2.775,3.133 6.49,4.7 11.145,4.7c4.744,0 8.392,-1.537 10.944,-4.61c2.551,-3.073 3.827,-7.445 3.827,-13.114c0,-5.729 -1.276,-10.145 -3.827,-13.249c-2.551,-3.103 -6.199,-4.655 -10.944,-4.655Z" style="fill:#8e8e93;fill-rule:nonzero;"/><path d="M2529.215,1494.93c-1.283,-0.985 -3.133,-1.477 -5.55,-1.477c-3.133,0 -5.752,1.477 -7.855,4.431c-2.104,2.954 -3.156,6.982 -3.156,12.085l0,23.364l-7.34,0l0,-45.833l7.34,0l0,9.444l0.179,0c1.044,-3.223 2.641,-5.737 4.789,-7.542c2.148,-1.805 4.551,-2.708 7.206,-2.708c1.91,0 3.372,0.209 4.386,0.627l0,7.609Z" style="fill:#8e8e93;fill-rule:nonzero;"/><path d="M2570.797,1509.074l0,24.259l-7.52,0l0,-64.185l17.635,0c6.863,0 12.182,1.671 15.957,5.013c3.775,3.342 5.662,8.057 5.662,14.144c0,6.087 -2.096,11.07 -6.289,14.95c-4.192,3.879 -9.854,5.819 -16.986,5.819l-8.459,0Zm0,-33.122l0,26.318l7.878,0c5.192,0 9.153,-1.186 11.884,-3.558c2.73,-2.372 4.095,-5.722 4.095,-10.048c0,-8.474 -5.013,-12.712 -15.039,-12.712l-8.818,0Z" style="fill:#8e8e93;fill-rule:nonzero;"/><path d="M2650.11,1487.5l-21.082,53.174c-3.76,9.489 -9.041,14.233 -15.845,14.233c-1.91,0 -3.506,-0.194 -4.789,-0.582l0,-6.58c1.581,0.537 3.029,0.806 4.342,0.806c3.7,0 6.475,-2.208 8.325,-6.624l3.67,-8.683l-17.904,-45.744l8.146,0l12.398,35.27c0.149,0.448 0.463,1.611 0.94,3.491l0.269,0c0.149,-0.716 0.448,-1.85 0.895,-3.402l13.025,-35.36l7.609,0Z" style="fill:#8e8e93;fill-rule:nonzero;"/><path d="M2679.248,1532.886c-1.731,0.955 -4.013,1.432 -6.848,1.432c-8.027,0 -12.04,-4.476 -12.04,-13.428l0,-27.124l-7.878,0l0,-6.266l7.878,0l0,-11.19l7.34,-2.372l0,13.562l11.548,0l0,6.266l-11.548,0l0,25.826c0,3.073 0.522,5.267 1.567,6.58c1.044,1.313 2.775,1.969 5.192,1.969c1.85,0 3.446,-0.507 4.789,-1.522l0,6.266Z" style="fill:#8e8e93;fill-rule:nonzero;"/><path d="M2727.096,1533.333l-7.34,0l0,-26.408c0,-9.549 -3.551,-14.323 -10.653,-14.323c-3.581,0 -6.595,1.38 -9.041,4.14c-2.447,2.76 -3.67,6.304 -3.67,10.63l0,25.96l-7.34,0l0,-67.855l7.34,0l0,29.631l0.179,0c3.521,-5.789 8.534,-8.683 15.039,-8.683c10.324,0 15.487,6.222 15.487,18.665l0,28.243Z" style="fill:#8e8e93;fill-rule:nonzero;"/><path d="M2760.083,1534.408c-6.774,0 -12.182,-2.141 -16.225,-6.423c-4.043,-4.282 -6.065,-9.959 -6.065,-17.031c0,-7.699 2.104,-13.711 6.311,-18.038c4.207,-4.327 9.892,-6.49 17.053,-6.49c6.833,0 12.167,2.104 16.001,6.311c3.834,4.207 5.752,10.041 5.752,17.501c0,7.311 -2.066,13.167 -6.199,17.568c-4.133,4.401 -9.675,6.602 -16.628,6.602Zm0.537,-41.805c-4.715,0 -8.445,1.604 -11.19,4.812c-2.745,3.208 -4.118,7.631 -4.118,13.271c0,5.431 1.388,9.713 4.163,12.846c2.775,3.133 6.49,4.7 11.145,4.7c4.744,0 8.392,-1.537 10.944,-4.61c2.551,-3.073 3.827,-7.445 3.827,-13.114c0,-5.729 -1.276,-10.145 -3.827,-13.249c-2.551,-3.103 -6.199,-4.655 -10.944,-4.655Z" style="fill:#8e8e93;fill-rule:nonzero;"/><path d="M2832.682,1533.333l-7.34,0l0,-26.139c0,-9.728 -3.551,-14.591 -10.653,-14.591c-3.67,0 -6.706,1.38 -9.108,4.14c-2.402,2.76 -3.603,6.244 -3.603,10.451l0,26.139l-7.34,0l0,-45.833l7.34,0l0,7.609l0.179,0c3.461,-5.789 8.474,-8.683 15.039,-8.683c5.013,0 8.847,1.619 11.503,4.856c2.656,3.238 3.984,7.915 3.984,14.032l0,28.019Z" style="fill:#8e8e93;fill-rule:nonzero;"/></g></g></svg>
@@ -0,0 +1 @@
1
+ <?xml version="1.0" encoding="UTF-8" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg width="730" height="206" viewBox="325 821 3042 858" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:affinity="https://www.affinity.studio/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;"><rect id="Logo---horizontal-light" affinity:id="Logo – horizontal light" x="0" y="0" width="3750" height="2500" style="fill:none;"/><clipPath id="_clip1"><rect id="Logo---horizontal-light1" affinity:id="Logo – horizontal light" x="0" y="0" width="3750" height="2500"/></clipPath><g clip-path="url(#_clip1)"><path d="M379.167,829.167l670.833,0c25.314,0 45.833,20.52 45.833,45.833c0,25.314 -20.52,45.833 -45.833,45.833l-670.833,0l-0,-91.667Z" style="fill:#e9ecf1;"/><path d="M366.977,829.167l590.462,0c25.807,0 46.727,20.52 46.727,45.833c0,25.314 -20.92,45.833 -46.727,45.833l-590.462,0l0,-91.667Z" style="fill:#0a84ff;"/><path d="M1239.75,875c0,18.226 -14.774,33 -33,33c-18.226,0 -33,-14.774 -33,-33c0,-18.226 14.774,-33 33,-33c18.226,0 33,14.774 33,33Z" style="fill:#0a84ff;"/><path d="M379.167,979.167l670.833,0c25.314,0 45.833,20.52 45.833,45.833c0,25.314 -20.52,45.833 -45.833,45.833l-670.833,0l-0,-91.667Z" style="fill:#e9ecf1;"/><path d="M379.167,979.167l670.833,0c25.314,0 45.833,20.52 45.833,45.833c0,25.314 -20.52,45.833 -45.833,45.833l-670.833,0l-0,-91.667Z" style="fill:#0a9fd8;"/><path d="M1239.75,1025c0,18.226 -14.774,33 -33,33c-18.226,0 -33,-14.774 -33,-33c0,-18.226 14.774,-33 33,-33c18.226,0 33,14.774 33,33Z" style="fill:#0a9fd8;"/><path d="M379.167,1129.167l670.833,0c25.314,0 45.833,20.52 45.833,45.833c0,25.314 -20.52,45.833 -45.833,45.833l-670.833,0l-0,-91.667Z" style="fill:#e9ecf1;"/><path d="M379.167,1129.167l579.167,0c25.314,0 45.833,20.52 45.833,45.833c0,25.314 -20.52,45.833 -45.833,45.833l-579.167,0l0,-91.667Z" style="fill:#14b8a6;"/><path d="M1239.75,1175c0,18.226 -14.774,33 -33,33c-18.226,0 -33,-14.774 -33,-33c0,-18.226 14.774,-33 33,-33c18.226,0 33,14.774 33,33Z" style="fill:#14b8a6;"/><path d="M379.167,1279.167l670.833,0c25.314,0 45.833,20.52 45.833,45.833c0,25.314 -20.52,45.833 -45.833,45.833l-670.833,0l-0,-91.667Z" style="fill:#e9ecf1;"/><path d="M379.167,1279.167l337.5,0c25.314,0 45.833,20.52 45.833,45.833c0,25.314 -20.52,45.833 -45.833,45.833l-337.5,0l0,-91.667Z" style="fill:#30c48d;"/><path d="M379.167,1429.167l670.833,0c25.314,0 45.833,20.52 45.833,45.833c0,25.314 -20.52,45.833 -45.833,45.833l-670.833,0l-0,-91.667Z" style="fill:#e9ecf1;"/><path d="M379.167,1429.167l212.5,0c25.314,0 45.833,20.52 45.833,45.833c0,25.314 -20.52,45.833 -45.833,45.833l-212.5,0l0,-91.667Z" style="fill:#8bc34a;"/><path d="M379.167,1579.167l670.833,0c25.314,0 45.833,20.52 45.833,45.833c0,25.314 -20.52,45.833 -45.833,45.833l-670.833,0l-0,-91.667Z" style="fill:#e9ecf1;"/><path d="M379.167,1579.167l120.833,0c25.314,0 45.833,20.52 45.833,45.833c0,25.314 -20.52,45.833 -45.833,45.833l-120.833,0l0,-91.667Z" style="fill:#ffb020;"/><path d="M379.167,829.167c25.314,0 45.833,20.52 45.833,45.833l0,750c0,25.314 -20.52,45.833 -45.833,45.833c-25.314,0 -45.833,-20.52 -45.833,-45.833l0,-750c0,-25.314 20.52,-45.833 45.833,-45.833Z" style="fill:#1c1c1e;"/><g><path d="M1369.434,1293.896l-0.684,0l0,111.597l-15.723,0l0,-255.493l15.723,0l0,36.06l0.684,0c6.266,-12.874 15.238,-22.815 26.917,-29.822c11.678,-7.007 24.524,-10.51 38.538,-10.51c22.217,0 39.563,7.662 52.039,22.986c12.476,15.324 18.713,36.145 18.713,62.463c0,29.281 -7.149,52.95 -21.448,71.008c-14.299,18.058 -33.183,27.087 -56.653,27.087c-26.204,0 -45.573,-11.792 -58.105,-35.376Zm-0.684,-65.112l0,22.046c0,17.546 5.526,32.613 16.577,45.203c11.051,12.59 25.578,18.884 43.579,18.884c17.887,0 32.414,-7.662 43.579,-22.986c11.165,-15.324 16.748,-35.461 16.748,-60.413c0,-21.875 -5.127,-39.25 -15.381,-52.124c-10.254,-12.874 -23.926,-19.312 -41.016,-19.312c-20.394,0 -36.174,6.836 -47.339,20.508c-11.165,13.672 -16.748,29.736 -16.748,48.193Z" style="fill:#1c1c1e;fill-rule:nonzero;"/><path d="M1653.638,1325l0,-35.034l-0.684,0c-5.583,11.963 -13.7,21.505 -24.353,28.625c-10.653,7.121 -22.473,10.681 -35.461,10.681c-16.634,0 -29.793,-4.671 -39.478,-14.014c-9.684,-9.342 -14.526,-21.134 -14.526,-35.376c0,-30.534 20.223,-48.991 60.669,-55.371l53.833,-8.032c0,-37.598 -14.128,-56.396 -42.383,-56.396c-19.255,0 -37.996,7.747 -56.226,23.242l0,-18.97c6.494,-5.127 15.295,-9.513 26.404,-13.159c11.108,-3.646 21.562,-5.469 31.36,-5.469c18.001,0 31.93,5.583 41.785,16.748c9.855,11.165 14.783,27.401 14.783,48.706l0,113.818l-15.723,0Zm-48.193,-87.158c-18.343,2.62 -31.217,6.864 -38.623,12.732c-7.406,5.868 -11.108,15.409 -11.108,28.625c0,10.368 3.446,18.913 10.339,25.635c6.893,6.722 16.492,10.083 28.796,10.083c16.862,0 30.876,-6.238 42.041,-18.713c11.165,-12.476 16.748,-28.569 16.748,-48.279l0,-17.09l-48.193,7.007Z" style="fill:#1c1c1e;fill-rule:nonzero;"/><path d="M1804.541,1166.406c-5.241,-3.76 -11.393,-5.64 -18.457,-5.64c-13.786,0 -25.35,7.121 -34.692,21.362c-9.342,14.242 -14.014,34.465 -14.014,60.669l0,82.202l-15.381,0l0,-175l15.381,0l0,38.794l0.684,0c3.988,-13.33 10.311,-23.698 18.97,-31.104c8.659,-7.406 18.685,-11.108 30.078,-11.108c6.494,0 12.305,1.025 17.432,3.076l0,16.748Z" style="fill:#1c1c1e;fill-rule:nonzero;"/><path d="M1942.114,1325l0,-35.034l-0.684,0c-5.583,11.963 -13.7,21.505 -24.353,28.625c-10.653,7.121 -22.473,10.681 -35.461,10.681c-16.634,0 -29.793,-4.671 -39.478,-14.014c-9.684,-9.342 -14.526,-21.134 -14.526,-35.376c0,-30.534 20.223,-48.991 60.669,-55.371l53.833,-8.032c0,-37.598 -14.128,-56.396 -42.383,-56.396c-19.255,0 -37.996,7.747 -56.226,23.242l0,-18.97c6.494,-5.127 15.295,-9.513 26.404,-13.159c11.108,-3.646 21.562,-5.469 31.36,-5.469c18.001,0 31.93,5.583 41.785,16.748c9.855,11.165 14.783,27.401 14.783,48.706l0,113.818l-15.723,0Zm-48.193,-87.158c-18.343,2.62 -31.217,6.864 -38.623,12.732c-7.406,5.868 -11.108,15.409 -11.108,28.625c0,10.368 3.446,18.913 10.339,25.635c6.893,6.722 16.492,10.083 28.796,10.083c16.862,0 30.876,-6.238 42.041,-18.713c11.165,-12.476 16.748,-28.569 16.748,-48.279l0,-17.09l-48.193,7.007Z" style="fill:#1c1c1e;fill-rule:nonzero;"/><path d="M2229.907,1325l0,-105.273c0,-21.989 -3.446,-37.427 -10.339,-46.313c-6.893,-8.887 -17.802,-13.33 -32.727,-13.33c-13.786,0 -25.692,5.924 -35.718,17.773c-10.026,11.849 -15.039,26.717 -15.039,44.604l0,102.539l-15.723,0l0,-106.47c0,-38.965 -14.811,-58.447 -44.434,-58.447c-14.242,0 -26.09,5.953 -35.547,17.859c-9.456,11.906 -14.185,27.315 -14.185,46.228l0,100.83l-15.723,0l0,-175l15.723,0l0,29.053l0.684,0c12.191,-22.217 30.021,-33.325 53.491,-33.325c12.76,0 23.669,3.674 32.727,11.023c9.058,7.349 15.181,17.004 18.372,28.967c5.469,-12.646 13.302,-22.473 23.499,-29.48c10.197,-7.007 21.277,-10.51 33.24,-10.51c38.281,0 57.422,23.698 57.422,71.094l0,108.179l-15.723,0Z" style="fill:#1c1c1e;fill-rule:nonzero;"/><path d="M2301.855,1238.184c0,24.04 5.554,42.839 16.663,56.396c11.108,13.558 26.347,20.337 45.715,20.337c19.596,0 38.737,-7.235 57.422,-21.704l0,16.748c-18.115,12.874 -38.338,19.312 -60.669,19.312c-22.559,0 -40.788,-8.089 -54.688,-24.268c-13.9,-16.178 -20.85,-39.022 -20.85,-68.53c0,-25.521 7.263,-47.026 21.79,-64.514c14.526,-17.489 33.411,-26.233 56.653,-26.233c21.761,0 38.452,7.633 50.073,22.9c11.621,15.267 17.432,36.117 17.432,62.549l0,7.007l-129.541,0Zm113.135,-14.355c-0.684,-20.166 -5.526,-35.832 -14.526,-46.997c-9.001,-11.165 -21.419,-16.748 -37.256,-16.748c-16.406,0 -29.993,5.497 -40.759,16.492c-10.767,10.994 -17.403,26.746 -19.91,47.253l112.451,0Z" style="fill:#1c1c1e;fill-rule:nonzero;"/><path d="M2544.019,1322.607c-8.203,3.874 -15.894,5.811 -23.071,5.811c-25.863,0 -38.794,-15.495 -38.794,-46.484l0,-117.578l-31.445,0l0,-14.355l31.445,0l0,-45.459c2.507,-0.911 5.127,-1.823 7.861,-2.734c2.734,-0.798 5.355,-1.652 7.861,-2.563l0,50.757l46.143,0l0,14.355l-46.143,0l0,115.527c0,12.077 1.908,20.821 5.725,26.233c3.817,5.412 10.282,8.118 19.397,8.118c6.494,0 13.501,-2.108 21.021,-6.323l0,14.697Z" style="fill:#1c1c1e;fill-rule:nonzero;"/><path d="M2582.471,1238.184c0,24.04 5.554,42.839 16.663,56.396c11.108,13.558 26.347,20.337 45.715,20.337c19.596,0 38.737,-7.235 57.422,-21.704l0,16.748c-18.115,12.874 -38.338,19.312 -60.669,19.312c-22.559,0 -40.788,-8.089 -54.688,-24.268c-13.9,-16.178 -20.85,-39.022 -20.85,-68.53c0,-25.521 7.263,-47.026 21.79,-64.514c14.526,-17.489 33.411,-26.233 56.653,-26.233c21.761,0 38.452,7.633 50.073,22.9c11.621,15.267 17.432,36.117 17.432,62.549l0,7.007l-129.541,0Zm113.135,-14.355c-0.684,-20.166 -5.526,-35.832 -14.526,-46.997c-9.001,-11.165 -21.419,-16.748 -37.256,-16.748c-16.406,0 -29.993,5.497 -40.759,16.492c-10.767,10.994 -17.403,26.746 -19.91,47.253l112.451,0Z" style="fill:#1c1c1e;fill-rule:nonzero;"/><path d="M2837.964,1166.406c-5.241,-3.76 -11.393,-5.64 -18.457,-5.64c-13.786,0 -25.35,7.121 -34.692,21.362c-9.342,14.242 -14.014,34.465 -14.014,60.669l0,82.202l-15.381,0l0,-175l15.381,0l0,38.794l0.684,0c3.988,-13.33 10.311,-23.698 18.97,-31.104c8.659,-7.406 18.685,-11.108 30.078,-11.108c6.494,0 12.305,1.025 17.432,3.076l0,16.748Z" style="fill:#1c1c1e;fill-rule:nonzero;"/><path d="M2970.239,1187.769c-4.785,-3.76 -11.678,-5.64 -20.679,-5.64c-11.735,0 -21.533,5.298 -29.395,15.894c-7.861,10.596 -11.792,25.008 -11.792,43.237l0,83.74l-39.648,0l0,-175l39.648,0l0,36.06l0.684,0c3.874,-12.305 9.827,-21.903 17.859,-28.796c8.032,-6.893 17.004,-10.339 26.917,-10.339c7.178,0 12.646,1.082 16.406,3.247l0,37.598Z" style="fill:#0a84ff;fill-rule:nonzero;"/><path d="M3150.879,1325l-39.648,0l0,-27.686l-0.684,0c-11.507,21.191 -29.395,31.787 -53.662,31.787c-41.357,0 -62.036,-24.837 -62.036,-74.512l0,-104.59l39.648,0l0,100.488c0,31.445 12.134,47.168 36.401,47.168c11.735,0 21.391,-4.329 28.967,-12.988c7.576,-8.659 11.365,-19.995 11.365,-34.009l0,-100.659l39.648,0l0,175Z" style="fill:#0a84ff;fill-rule:nonzero;"/><path d="M3358.35,1325l-39.648,0l0,-98.608c0,-32.699 -11.564,-49.048 -34.692,-49.048c-12.077,0 -22.046,4.529 -29.907,13.586c-7.861,9.058 -11.792,20.479 -11.792,34.265l0,99.805l-39.819,0l0,-175l39.819,0l0,29.053l0.684,0c13.102,-22.103 32.015,-33.154 56.738,-33.154c19.027,0 33.553,6.181 43.579,18.542c10.026,12.362 15.039,30.221 15.039,53.577l0,106.982Z" style="fill:#0a84ff;fill-rule:nonzero;"/></g><g><path d="M1357.601,1509.074l0,24.259l-7.52,0l0,-64.185l17.635,0c6.863,0 12.182,1.671 15.957,5.013c3.775,3.342 5.662,8.057 5.662,14.144c0,6.087 -2.096,11.07 -6.289,14.95c-4.192,3.879 -9.854,5.819 -16.986,5.819l-8.459,0Zm0,-33.122l0,26.318l7.878,0c5.192,0 9.153,-1.186 11.884,-3.558c2.73,-2.372 4.095,-5.722 4.095,-10.048c0,-8.474 -5.013,-12.712 -15.039,-12.712l-8.818,0Z" style="fill:#8e8e93;fill-rule:nonzero;"/><path d="M1430.111,1533.333l-7.34,0l0,-7.161l-0.179,0c-3.193,5.49 -7.893,8.236 -14.099,8.236c-4.565,0 -8.139,-1.208 -10.72,-3.625c-2.581,-2.417 -3.872,-5.625 -3.872,-9.623c0,-8.564 5.043,-13.547 15.129,-14.95l13.741,-1.925c0,-7.788 -3.148,-11.682 -9.444,-11.682c-5.52,0 -10.503,1.88 -14.95,5.64l0,-7.52c4.506,-2.865 9.698,-4.297 15.576,-4.297c10.772,0 16.158,5.699 16.158,17.098l0,29.81Zm-7.34,-23.185l-11.056,1.522c-3.402,0.477 -5.968,1.32 -7.699,2.529c-1.731,1.208 -2.596,3.349 -2.596,6.423c0,2.238 0.798,4.066 2.395,5.483c1.596,1.417 3.722,2.126 6.378,2.126c3.64,0 6.647,-1.276 9.019,-3.827c2.372,-2.551 3.558,-5.781 3.558,-9.69l0,-4.565Z" style="fill:#8e8e93;fill-rule:nonzero;"/><path d="M1467.843,1494.93c-1.283,-0.985 -3.133,-1.477 -5.55,-1.477c-3.133,0 -5.752,1.477 -7.855,4.431c-2.104,2.954 -3.156,6.982 -3.156,12.085l0,23.364l-7.34,0l0,-45.833l7.34,0l0,9.444l0.179,0c1.044,-3.223 2.641,-5.737 4.789,-7.542c2.148,-1.805 4.551,-2.708 7.206,-2.708c1.91,0 3.372,0.209 4.386,0.627l0,7.609Z" style="fill:#8e8e93;fill-rule:nonzero;"/><path d="M1508.618,1533.333l-7.34,0l0,-7.161l-0.179,0c-3.193,5.49 -7.893,8.236 -14.099,8.236c-4.565,0 -8.139,-1.208 -10.72,-3.625c-2.581,-2.417 -3.872,-5.625 -3.872,-9.623c0,-8.564 5.043,-13.547 15.129,-14.95l13.741,-1.925c0,-7.788 -3.148,-11.682 -9.444,-11.682c-5.52,0 -10.503,1.88 -14.95,5.64l0,-7.52c4.506,-2.865 9.698,-4.297 15.576,-4.297c10.772,0 16.158,5.699 16.158,17.098l0,29.81Zm-7.34,-23.185l-11.056,1.522c-3.402,0.477 -5.968,1.32 -7.699,2.529c-1.731,1.208 -2.596,3.349 -2.596,6.423c0,2.238 0.798,4.066 2.395,5.483c1.596,1.417 3.722,2.126 6.378,2.126c3.64,0 6.647,-1.276 9.019,-3.827c2.372,-2.551 3.558,-5.781 3.558,-9.69l0,-4.565Z" style="fill:#8e8e93;fill-rule:nonzero;"/><rect x="1522.449" y="1465.479" width="7.34" height="67.855" style="fill:#8e8e93;fill-rule:nonzero;"/><rect x="1544.649" y="1465.479" width="7.34" height="67.855" style="fill:#8e8e93;fill-rule:nonzero;"/><path d="M1603.687,1512.252l-32.361,0c0.119,5.103 1.492,9.041 4.118,11.816c2.626,2.775 6.236,4.163 10.832,4.163c5.162,0 9.907,-1.701 14.233,-5.103l0,6.893c-4.028,2.924 -9.355,4.386 -15.979,4.386c-6.475,0 -11.563,-2.081 -15.263,-6.244c-3.7,-4.163 -5.55,-10.019 -5.55,-17.568c0,-7.132 2.022,-12.943 6.065,-17.434c4.043,-4.491 9.064,-6.736 15.061,-6.736c5.998,0 10.638,1.94 13.92,5.819c3.282,3.879 4.924,9.265 4.924,16.158l0,3.849Zm-7.52,-6.222c-0.03,-4.237 -1.052,-7.534 -3.066,-9.892c-2.014,-2.357 -4.812,-3.536 -8.392,-3.536c-3.461,0 -6.401,1.238 -8.818,3.715c-2.417,2.477 -3.909,5.714 -4.476,9.713l24.752,0Z" style="fill:#8e8e93;fill-rule:nonzero;"/><rect x="1614.787" y="1465.479" width="7.34" height="67.855" style="fill:#8e8e93;fill-rule:nonzero;"/><path d="M1669.617,1526.709l-0.179,0l0,27.706l-7.34,0l0,-66.915l7.34,0l0,8.057l0.179,0c3.611,-6.087 8.892,-9.131 15.845,-9.131c5.908,0 10.518,2.051 13.831,6.154c3.312,4.103 4.968,9.601 4.968,16.494c0,7.669 -1.865,13.808 -5.595,18.418c-3.73,4.61 -8.832,6.915 -15.308,6.915c-5.938,0 -10.518,-2.566 -13.741,-7.699Zm-0.179,-18.486l0,6.401c0,3.79 1.231,7.005 3.693,9.646c2.462,2.641 5.587,3.961 9.377,3.961c4.446,0 7.93,-1.701 10.451,-5.103c2.521,-3.402 3.782,-8.131 3.782,-14.189c0,-5.103 -1.179,-9.101 -3.536,-11.995c-2.357,-2.894 -5.55,-4.342 -9.578,-4.342c-4.267,0 -7.699,1.485 -10.295,4.454c-2.596,2.969 -3.894,6.691 -3.894,11.167Z" style="fill:#8e8e93;fill-rule:nonzero;"/><path d="M1748.796,1533.333l-7.34,0l0,-7.161l-0.179,0c-3.193,5.49 -7.893,8.236 -14.099,8.236c-4.565,0 -8.139,-1.208 -10.72,-3.625c-2.581,-2.417 -3.872,-5.625 -3.872,-9.623c0,-8.564 5.043,-13.547 15.129,-14.95l13.741,-1.925c0,-7.788 -3.148,-11.682 -9.444,-11.682c-5.52,0 -10.503,1.88 -14.95,5.64l0,-7.52c4.506,-2.865 9.698,-4.297 15.576,-4.297c10.772,0 16.158,5.699 16.158,17.098l0,29.81Zm-7.34,-23.185l-11.056,1.522c-3.402,0.477 -5.968,1.32 -7.699,2.529c-1.731,1.208 -2.596,3.349 -2.596,6.423c0,2.238 0.798,4.066 2.395,5.483c1.596,1.417 3.722,2.126 6.378,2.126c3.64,0 6.647,-1.276 9.019,-3.827c2.372,-2.551 3.558,-5.781 3.558,-9.69l0,-4.565Z" style="fill:#8e8e93;fill-rule:nonzero;"/><path d="M1786.528,1494.93c-1.283,-0.985 -3.133,-1.477 -5.55,-1.477c-3.133,0 -5.752,1.477 -7.855,4.431c-2.104,2.954 -3.156,6.982 -3.156,12.085l0,23.364l-7.34,0l0,-45.833l7.34,0l0,9.444l0.179,0c1.044,-3.223 2.641,-5.737 4.789,-7.542c2.148,-1.805 4.551,-2.708 7.206,-2.708c1.91,0 3.372,0.209 4.386,0.627l0,7.609Z" style="fill:#8e8e93;fill-rule:nonzero;"/><path d="M1827.303,1533.333l-7.34,0l0,-7.161l-0.179,0c-3.193,5.49 -7.893,8.236 -14.099,8.236c-4.565,0 -8.139,-1.208 -10.72,-3.625c-2.581,-2.417 -3.872,-5.625 -3.872,-9.623c0,-8.564 5.043,-13.547 15.129,-14.95l13.741,-1.925c0,-7.788 -3.148,-11.682 -9.444,-11.682c-5.52,0 -10.503,1.88 -14.95,5.64l0,-7.52c4.506,-2.865 9.698,-4.297 15.576,-4.297c10.772,0 16.158,5.699 16.158,17.098l0,29.81Zm-7.34,-23.185l-11.056,1.522c-3.402,0.477 -5.968,1.32 -7.699,2.529c-1.731,1.208 -2.596,3.349 -2.596,6.423c0,2.238 0.798,4.066 2.395,5.483c1.596,1.417 3.722,2.126 6.378,2.126c3.64,0 6.647,-1.276 9.019,-3.827c2.372,-2.551 3.558,-5.781 3.558,-9.69l0,-4.565Z" style="fill:#8e8e93;fill-rule:nonzero;"/><path d="M1906.213,1533.333l-7.34,0l0,-26.318c0,-5.073 -0.783,-8.743 -2.35,-11.011c-1.567,-2.268 -4.2,-3.402 -7.9,-3.402c-3.133,0 -5.796,1.432 -7.99,4.297c-2.193,2.865 -3.29,6.296 -3.29,10.295l0,26.139l-7.34,0l0,-27.214c0,-9.012 -3.476,-13.517 -10.429,-13.517c-3.223,0 -5.878,1.35 -7.967,4.051c-2.089,2.7 -3.133,6.214 -3.133,10.541l0,26.139l-7.34,0l0,-45.833l7.34,0l0,7.251l0.179,0c3.252,-5.55 7.997,-8.325 14.233,-8.325c3.133,0 5.863,0.873 8.191,2.618c2.327,1.746 3.924,4.036 4.789,6.871c3.402,-6.326 8.474,-9.489 15.218,-9.489c10.086,0 15.129,6.222 15.129,18.665l0,28.243Z" style="fill:#8e8e93;fill-rule:nonzero;"/><path d="M1956.925,1512.252l-32.361,0c0.119,5.103 1.492,9.041 4.118,11.816c2.626,2.775 6.236,4.163 10.832,4.163c5.162,0 9.907,-1.701 14.233,-5.103l0,6.893c-4.028,2.924 -9.355,4.386 -15.979,4.386c-6.475,0 -11.563,-2.081 -15.263,-6.244c-3.7,-4.163 -5.55,-10.019 -5.55,-17.568c0,-7.132 2.022,-12.943 6.065,-17.434c4.043,-4.491 9.064,-6.736 15.061,-6.736c5.998,0 10.638,1.94 13.92,5.819c3.282,3.879 4.924,9.265 4.924,16.158l0,3.849Zm-7.52,-6.222c-0.03,-4.237 -1.052,-7.534 -3.066,-9.892c-2.014,-2.357 -4.812,-3.536 -8.392,-3.536c-3.461,0 -6.401,1.238 -8.818,3.715c-2.417,2.477 -3.909,5.714 -4.476,9.713l24.752,0Z" style="fill:#8e8e93;fill-rule:nonzero;"/><path d="M1989.286,1532.886c-1.731,0.955 -4.013,1.432 -6.848,1.432c-8.027,0 -12.04,-4.476 -12.04,-13.428l0,-27.124l-7.878,0l0,-6.266l7.878,0l0,-11.19l7.34,-2.372l0,13.562l11.548,0l0,6.266l-11.548,0l0,25.826c0,3.073 0.522,5.267 1.567,6.58c1.044,1.313 2.775,1.969 5.192,1.969c1.85,0 3.446,-0.507 4.789,-1.522l0,6.266Z" style="fill:#8e8e93;fill-rule:nonzero;"/><path d="M2035.925,1512.252l-32.361,0c0.119,5.103 1.492,9.041 4.118,11.816c2.626,2.775 6.236,4.163 10.832,4.163c5.162,0 9.907,-1.701 14.233,-5.103l0,6.893c-4.028,2.924 -9.355,4.386 -15.979,4.386c-6.475,0 -11.563,-2.081 -15.263,-6.244c-3.7,-4.163 -5.55,-10.019 -5.55,-17.568c0,-7.132 2.022,-12.943 6.065,-17.434c4.043,-4.491 9.064,-6.736 15.061,-6.736c5.998,0 10.638,1.94 13.92,5.819c3.282,3.879 4.924,9.265 4.924,16.158l0,3.849Zm-7.52,-6.222c-0.03,-4.237 -1.052,-7.534 -3.066,-9.892c-2.014,-2.357 -4.812,-3.536 -8.392,-3.536c-3.461,0 -6.401,1.238 -8.818,3.715c-2.417,2.477 -3.909,5.714 -4.476,9.713l24.752,0Z" style="fill:#8e8e93;fill-rule:nonzero;"/><path d="M2070.927,1494.93c-1.283,-0.985 -3.133,-1.477 -5.55,-1.477c-3.133,0 -5.752,1.477 -7.855,4.431c-2.104,2.954 -3.156,6.982 -3.156,12.085l0,23.364l-7.34,0l0,-45.833l7.34,0l0,9.444l0.179,0c1.044,-3.223 2.641,-5.737 4.789,-7.542c2.148,-1.805 4.551,-2.708 7.206,-2.708c1.91,0 3.372,0.209 4.386,0.627l0,7.609Z" style="fill:#8e8e93;fill-rule:nonzero;"/><path d="M2101.229,1531.677l0,-7.878c3.998,2.954 8.4,4.431 13.204,4.431c6.445,0 9.668,-2.148 9.668,-6.445c0,-1.223 -0.276,-2.26 -0.828,-3.111c-0.552,-0.85 -1.298,-1.604 -2.238,-2.26c-0.94,-0.656 -2.044,-1.246 -3.312,-1.768c-1.268,-0.522 -2.633,-1.067 -4.095,-1.634c-2.029,-0.806 -3.812,-1.619 -5.349,-2.439c-1.537,-0.821 -2.82,-1.746 -3.849,-2.775c-1.029,-1.029 -1.805,-2.201 -2.327,-3.514c-0.522,-1.313 -0.783,-2.85 -0.783,-4.61c0,-2.148 0.492,-4.051 1.477,-5.707c0.985,-1.656 2.298,-3.044 3.939,-4.163c1.641,-1.119 3.514,-1.962 5.617,-2.529c2.104,-0.567 4.274,-0.85 6.512,-0.85c3.969,0 7.52,0.686 10.653,2.059l0,7.43c-3.372,-2.208 -7.251,-3.312 -11.637,-3.312c-1.373,0 -2.611,0.157 -3.715,0.47c-1.104,0.313 -2.051,0.753 -2.842,1.32c-0.791,0.567 -1.402,1.246 -1.835,2.037c-0.433,0.791 -0.649,1.664 -0.649,2.618c0,1.194 0.216,2.193 0.649,2.999c0.433,0.806 1.067,1.522 1.902,2.148c0.836,0.627 1.85,1.194 3.044,1.701c1.194,0.507 2.551,1.059 4.073,1.656c2.029,0.776 3.849,1.574 5.461,2.395c1.611,0.821 2.984,1.746 4.118,2.775c1.134,1.029 2.007,2.216 2.618,3.558c0.612,1.343 0.918,2.939 0.918,4.789c0,2.268 -0.5,4.237 -1.499,5.908c-1,1.671 -2.335,3.059 -4.006,4.163c-1.671,1.104 -3.596,1.925 -5.774,2.462c-2.178,0.537 -4.461,0.806 -6.848,0.806c-4.715,0 -8.803,-0.91 -12.264,-2.73Z" style="fill:#8e8e93;fill-rule:nonzero;"/><path d="M2200.639,1487.5l-13.741,45.833l-7.609,0l-9.444,-32.808c-0.358,-1.253 -0.597,-2.671 -0.716,-4.252l-0.179,0c-0.09,1.074 -0.403,2.462 -0.94,4.163l-10.25,32.898l-7.34,0l-13.875,-45.833l7.699,0l9.489,34.465c0.298,1.044 0.507,2.417 0.627,4.118l0.358,0c0.09,-1.313 0.358,-2.715 0.806,-4.207l10.563,-34.375l6.714,0l9.489,34.554c0.298,1.104 0.522,2.477 0.671,4.118l0.358,0c0.06,-1.164 0.313,-2.536 0.761,-4.118l9.31,-34.554l7.251,0Z" style="fill:#8e8e93;fill-rule:nonzero;"/><path d="M2245.98,1512.252l-32.361,0c0.119,5.103 1.492,9.041 4.118,11.816c2.626,2.775 6.236,4.163 10.832,4.163c5.162,0 9.907,-1.701 14.233,-5.103l0,6.893c-4.028,2.924 -9.355,4.386 -15.979,4.386c-6.475,0 -11.563,-2.081 -15.263,-6.244c-3.7,-4.163 -5.55,-10.019 -5.55,-17.568c0,-7.132 2.022,-12.943 6.065,-17.434c4.043,-4.491 9.064,-6.736 15.061,-6.736c5.998,0 10.638,1.94 13.92,5.819c3.282,3.879 4.924,9.265 4.924,16.158l0,3.849Zm-7.52,-6.222c-0.03,-4.237 -1.052,-7.534 -3.066,-9.892c-2.014,-2.357 -4.812,-3.536 -8.392,-3.536c-3.461,0 -6.401,1.238 -8.818,3.715c-2.417,2.477 -3.909,5.714 -4.476,9.713l24.752,0Z" style="fill:#8e8e93;fill-rule:nonzero;"/><path d="M2293.917,1512.252l-32.361,0c0.119,5.103 1.492,9.041 4.118,11.816c2.626,2.775 6.236,4.163 10.832,4.163c5.162,0 9.907,-1.701 14.233,-5.103l0,6.893c-4.028,2.924 -9.355,4.386 -15.979,4.386c-6.475,0 -11.563,-2.081 -15.263,-6.244c-3.7,-4.163 -5.55,-10.019 -5.55,-17.568c0,-7.132 2.022,-12.943 6.065,-17.434c4.043,-4.491 9.064,-6.736 15.061,-6.736c5.998,0 10.638,1.94 13.92,5.819c3.282,3.879 4.924,9.265 4.924,16.158l0,3.849Zm-7.52,-6.222c-0.03,-4.237 -1.052,-7.534 -3.066,-9.892c-2.014,-2.357 -4.812,-3.536 -8.392,-3.536c-3.461,0 -6.401,1.238 -8.818,3.715c-2.417,2.477 -3.909,5.714 -4.476,9.713l24.752,0Z" style="fill:#8e8e93;fill-rule:nonzero;"/><path d="M2312.537,1526.709l-0.179,0l0,27.706l-7.34,0l0,-66.915l7.34,0l0,8.057l0.179,0c3.611,-6.087 8.892,-9.131 15.845,-9.131c5.908,0 10.518,2.051 13.831,6.154c3.312,4.103 4.968,9.601 4.968,16.494c0,7.669 -1.865,13.808 -5.595,18.418c-3.73,4.61 -8.832,6.915 -15.308,6.915c-5.938,0 -10.518,-2.566 -13.741,-7.699Zm-0.179,-18.486l0,6.401c0,3.79 1.231,7.005 3.693,9.646c2.462,2.641 5.587,3.961 9.377,3.961c4.446,0 7.93,-1.701 10.451,-5.103c2.521,-3.402 3.782,-8.131 3.782,-14.189c0,-5.103 -1.179,-9.101 -3.536,-11.995c-2.357,-2.894 -5.55,-4.342 -9.578,-4.342c-4.267,0 -7.699,1.485 -10.295,4.454c-2.596,2.969 -3.894,6.691 -3.894,11.167Z" style="fill:#8e8e93;fill-rule:nonzero;"/><path d="M2356.132,1531.677l0,-7.878c3.998,2.954 8.4,4.431 13.204,4.431c6.445,0 9.668,-2.148 9.668,-6.445c0,-1.223 -0.276,-2.26 -0.828,-3.111c-0.552,-0.85 -1.298,-1.604 -2.238,-2.26c-0.94,-0.656 -2.044,-1.246 -3.312,-1.768c-1.268,-0.522 -2.633,-1.067 -4.095,-1.634c-2.029,-0.806 -3.812,-1.619 -5.349,-2.439c-1.537,-0.821 -2.82,-1.746 -3.849,-2.775c-1.029,-1.029 -1.805,-2.201 -2.327,-3.514c-0.522,-1.313 -0.783,-2.85 -0.783,-4.61c0,-2.148 0.492,-4.051 1.477,-5.707c0.985,-1.656 2.298,-3.044 3.939,-4.163c1.641,-1.119 3.514,-1.962 5.617,-2.529c2.104,-0.567 4.274,-0.85 6.512,-0.85c3.969,0 7.52,0.686 10.653,2.059l0,7.43c-3.372,-2.208 -7.251,-3.312 -11.637,-3.312c-1.373,0 -2.611,0.157 -3.715,0.47c-1.104,0.313 -2.051,0.753 -2.842,1.32c-0.791,0.567 -1.402,1.246 -1.835,2.037c-0.433,0.791 -0.649,1.664 -0.649,2.618c0,1.194 0.216,2.193 0.649,2.999c0.433,0.806 1.067,1.522 1.902,2.148c0.836,0.627 1.85,1.194 3.044,1.701c1.194,0.507 2.551,1.059 4.073,1.656c2.029,0.776 3.849,1.574 5.461,2.395c1.611,0.821 2.984,1.746 4.118,2.775c1.134,1.029 2.007,2.216 2.618,3.558c0.612,1.343 0.918,2.939 0.918,4.789c0,2.268 -0.5,4.237 -1.499,5.908c-1,1.671 -2.335,3.059 -4.006,4.163c-1.671,1.104 -3.596,1.925 -5.774,2.462c-2.178,0.537 -4.461,0.806 -6.848,0.806c-4.715,0 -8.803,-0.91 -12.264,-2.73Z" style="fill:#8e8e93;fill-rule:nonzero;"/><path d="M2445.561,1471.924c-1.432,-0.806 -3.059,-1.208 -4.879,-1.208c-5.132,0 -7.699,3.238 -7.699,9.713l0,7.072l10.742,0l0,6.266l-10.742,0l0,39.567l-7.296,0l0,-39.567l-7.833,0l0,-6.266l7.833,0l0,-7.43c0,-4.804 1.388,-8.601 4.163,-11.391c2.775,-2.79 6.236,-4.185 10.384,-4.185c2.238,0 4.013,0.269 5.326,0.806l0,6.624Z" style="fill:#8e8e93;fill-rule:nonzero;"/><path d="M2470.76,1534.408c-6.774,0 -12.182,-2.141 -16.225,-6.423c-4.043,-4.282 -6.065,-9.959 -6.065,-17.031c0,-7.699 2.104,-13.711 6.311,-18.038c4.207,-4.327 9.892,-6.49 17.053,-6.49c6.833,0 12.167,2.104 16.001,6.311c3.834,4.207 5.752,10.041 5.752,17.501c0,7.311 -2.066,13.167 -6.199,17.568c-4.133,4.401 -9.675,6.602 -16.628,6.602Zm0.537,-41.805c-4.715,0 -8.445,1.604 -11.19,4.812c-2.745,3.208 -4.118,7.631 -4.118,13.271c0,5.431 1.388,9.713 4.163,12.846c2.775,3.133 6.49,4.7 11.145,4.7c4.744,0 8.392,-1.537 10.944,-4.61c2.551,-3.073 3.827,-7.445 3.827,-13.114c0,-5.729 -1.276,-10.145 -3.827,-13.249c-2.551,-3.103 -6.199,-4.655 -10.944,-4.655Z" style="fill:#8e8e93;fill-rule:nonzero;"/><path d="M2529.215,1494.93c-1.283,-0.985 -3.133,-1.477 -5.55,-1.477c-3.133,0 -5.752,1.477 -7.855,4.431c-2.104,2.954 -3.156,6.982 -3.156,12.085l0,23.364l-7.34,0l0,-45.833l7.34,0l0,9.444l0.179,0c1.044,-3.223 2.641,-5.737 4.789,-7.542c2.148,-1.805 4.551,-2.708 7.206,-2.708c1.91,0 3.372,0.209 4.386,0.627l0,7.609Z" style="fill:#8e8e93;fill-rule:nonzero;"/><path d="M2570.797,1509.074l0,24.259l-7.52,0l0,-64.185l17.635,0c6.863,0 12.182,1.671 15.957,5.013c3.775,3.342 5.662,8.057 5.662,14.144c0,6.087 -2.096,11.07 -6.289,14.95c-4.192,3.879 -9.854,5.819 -16.986,5.819l-8.459,0Zm0,-33.122l0,26.318l7.878,0c5.192,0 9.153,-1.186 11.884,-3.558c2.73,-2.372 4.095,-5.722 4.095,-10.048c0,-8.474 -5.013,-12.712 -15.039,-12.712l-8.818,0Z" style="fill:#8e8e93;fill-rule:nonzero;"/><path d="M2650.11,1487.5l-21.082,53.174c-3.76,9.489 -9.041,14.233 -15.845,14.233c-1.91,0 -3.506,-0.194 -4.789,-0.582l0,-6.58c1.581,0.537 3.029,0.806 4.342,0.806c3.7,0 6.475,-2.208 8.325,-6.624l3.67,-8.683l-17.904,-45.744l8.146,0l12.398,35.27c0.149,0.448 0.463,1.611 0.94,3.491l0.269,0c0.149,-0.716 0.448,-1.85 0.895,-3.402l13.025,-35.36l7.609,0Z" style="fill:#8e8e93;fill-rule:nonzero;"/><path d="M2679.248,1532.886c-1.731,0.955 -4.013,1.432 -6.848,1.432c-8.027,0 -12.04,-4.476 -12.04,-13.428l0,-27.124l-7.878,0l0,-6.266l7.878,0l0,-11.19l7.34,-2.372l0,13.562l11.548,0l0,6.266l-11.548,0l0,25.826c0,3.073 0.522,5.267 1.567,6.58c1.044,1.313 2.775,1.969 5.192,1.969c1.85,0 3.446,-0.507 4.789,-1.522l0,6.266Z" style="fill:#8e8e93;fill-rule:nonzero;"/><path d="M2727.096,1533.333l-7.34,0l0,-26.408c0,-9.549 -3.551,-14.323 -10.653,-14.323c-3.581,0 -6.595,1.38 -9.041,4.14c-2.447,2.76 -3.67,6.304 -3.67,10.63l0,25.96l-7.34,0l0,-67.855l7.34,0l0,29.631l0.179,0c3.521,-5.789 8.534,-8.683 15.039,-8.683c10.324,0 15.487,6.222 15.487,18.665l0,28.243Z" style="fill:#8e8e93;fill-rule:nonzero;"/><path d="M2760.083,1534.408c-6.774,0 -12.182,-2.141 -16.225,-6.423c-4.043,-4.282 -6.065,-9.959 -6.065,-17.031c0,-7.699 2.104,-13.711 6.311,-18.038c4.207,-4.327 9.892,-6.49 17.053,-6.49c6.833,0 12.167,2.104 16.001,6.311c3.834,4.207 5.752,10.041 5.752,17.501c0,7.311 -2.066,13.167 -6.199,17.568c-4.133,4.401 -9.675,6.602 -16.628,6.602Zm0.537,-41.805c-4.715,0 -8.445,1.604 -11.19,4.812c-2.745,3.208 -4.118,7.631 -4.118,13.271c0,5.431 1.388,9.713 4.163,12.846c2.775,3.133 6.49,4.7 11.145,4.7c4.744,0 8.392,-1.537 10.944,-4.61c2.551,-3.073 3.827,-7.445 3.827,-13.114c0,-5.729 -1.276,-10.145 -3.827,-13.249c-2.551,-3.103 -6.199,-4.655 -10.944,-4.655Z" style="fill:#8e8e93;fill-rule:nonzero;"/><path d="M2832.682,1533.333l-7.34,0l0,-26.139c0,-9.728 -3.551,-14.591 -10.653,-14.591c-3.67,0 -6.706,1.38 -9.108,4.14c-2.402,2.76 -3.603,6.244 -3.603,10.451l0,26.139l-7.34,0l0,-45.833l7.34,0l0,7.609l0.179,0c3.461,-5.789 8.474,-8.683 15.039,-8.683c5.013,0 8.847,1.619 11.503,4.856c2.656,3.238 3.984,7.915 3.984,14.032l0,28.019Z" style="fill:#8e8e93;fill-rule:nonzero;"/></g></g></svg>
@@ -0,0 +1 @@
1
+ --8<-- "CHANGELOG.md"
@@ -0,0 +1,3 @@
1
+ --8<-- "CONTRIBUTING.md"
2
+
3
+ --8<-- "README.md:devchecks"
@@ -0,0 +1,3 @@
1
+ # Parallel backends
2
+
3
+ --8<-- "README.md:backends"
@@ -0,0 +1,5 @@
1
+ # Errors and validation
2
+
3
+ --8<-- "README.md:errors"
4
+
5
+ --8<-- "README.md:validation"
@@ -0,0 +1 @@
1
+ --8<-- "README.md:progress"
@@ -0,0 +1,5 @@
1
+ # Saving results and checkpoints
2
+
3
+ --8<-- "README.md:saving"
4
+
5
+ --8<-- "README.md:checkpoints"
@@ -0,0 +1,14 @@
1
+ ---
2
+ title: Home
3
+ ---
4
+
5
+ # parameterrun { .md-visually-hidden }
6
+
7
+ ![parameterrun](assets/logo-readme-light.svg#only-light){ .pr-hero }
8
+ ![parameterrun](assets/logo-readme-dark.svg#only-dark){ .pr-hero }
9
+
10
+ --8<-- "README.md:intro"
11
+
12
+ --8<-- "README.md:install"
13
+
14
+ --8<-- "README.md:idea"
@@ -0,0 +1,5 @@
1
+ --8<-- "README.md:quickstart"
2
+
3
+ --8<-- "README.md:inputs"
4
+
5
+ --8<-- "README.md:outputs"
@@ -0,0 +1,12 @@
1
+ # API reference
2
+
3
+ `parameterrun` exposes a single public function.
4
+
5
+ ::: parameterrun.parameterrun
6
+ options:
7
+ show_root_heading: true
8
+ show_root_full_path: false
9
+
10
+ ## Parameters at a glance
11
+
12
+ --8<-- "README.md:api"
@@ -3,13 +3,15 @@
3
3
  > **Keep this in sync:** this page describes [.github/workflows/](../.github/workflows/). When a workflow changes
4
4
  > (triggers, jobs, matrix, steps, conditions), update the chart and the tables below in the same change.
5
5
 
6
- The repository has three workflows. They form one pipeline, from a pull request to a PyPI release:
6
+ The repository has four workflows. CI, Release and Publish form one pipeline, from a pull request to a PyPI release;
7
+ Docs publishes the documentation site in parallel:
7
8
 
8
9
  | Workflow | File | Trigger | What it does |
9
10
  | --- | --- | --- | --- |
10
- | CI | [ci.yml](../.github/workflows/ci.yml) | `pull_request` into `main` | Tests, lint and type check on 15 OS/Python combinations, plus MPI tests on Linux, macOS and Windows |
11
+ | CI | [ci.yml](../.github/workflows/ci.yml) | `pull_request` into `main` | Tests, lint and type check on 15 OS/Python combinations (coverage uploaded to Codecov from one), plus MPI tests on Linux, macOS and Windows |
11
12
  | Release | [release.yml](../.github/workflows/release.yml) | `push` to `main` (i.e. a merged PR) | Reads `__version__`, checks that the tag is new and that `CHANGELOG.md` has a matching entry, then creates the GitHub release and tag `vX.Y.Z` |
12
13
  | Publish | [publish.yml](../.github/workflows/publish.yml) | `workflow_run`: Release completed | If Release succeeded: builds the sdist and wheel, checks them, and uploads them to PyPI |
14
+ | Docs | [docs.yml](../.github/workflows/docs.yml) | `pull_request` into `main`, `push` to `main`, `workflow_dispatch` | Builds the site with Zensical (`zensical build --strict`); on pull requests only as a check, otherwise also deploys it to GitHub Pages |
13
15
 
14
16
  ## Pipeline chart
15
17
 
@@ -20,11 +22,12 @@ The repository has three workflows. They form one pipeline, from a pull request
20
22
  ```mermaid
21
23
  flowchart TD
22
24
  work(["Work on dev / feature branches"]) -->|"open a PR into main"| pr
25
+ work -->|"open a PR into main"| dbuild
23
26
 
24
27
  subgraph CI["ci.yml: on pull_request into main"]
25
28
  pr{{"pull_request event"}}
26
29
  matrix["job: test (15 runs, fail-fast off)<br/>os: ubuntu, macos, windows<br/>python: 3.11, 3.12, 3.13, 3.14, 3.15"]
27
- msteps["checkout, setup-python, pip install uv, uv sync<br/>pytest -m 'not mpi and not mpi_subprocess' (coverage gate 70%)<br/>ruff check, mypy"]
30
+ msteps["checkout, setup-python, pip install uv, uv sync<br/>pytest -m 'not mpi and not mpi_subprocess' (coverage gate 70%)<br/>ruff check, mypy<br/>ubuntu + py3.12 only: upload coverage.xml to Codecov"]
28
31
  mpi["job: test-mpi (7 runs, fail-fast off)<br/>Python 3.12<br/>ubuntu: Open MPI + MPICH + Intel MPI<br/>macos: Open MPI + MPICH<br/>windows: Microsoft MPI + Intel MPI"]
29
32
  mpisteps["uv sync --extra mpi, verify native MPI runtime<br/>full MPI suite: 4 ranks<br/>scheduling and idle-worker tests: 8 ranks<br/>pytest -m mpi_subprocess (starts its own mpiexec)"]
30
33
  pr --> matrix --> msteps
@@ -64,6 +67,14 @@ flowchart TD
64
67
  okq -->|"yes"| build --> pypi
65
68
  okq -->|"no"| skip
66
69
  end
70
+
71
+ merge -->|"push to main"| dbuild
72
+
73
+ subgraph DOCS["docs.yml: on PR into main, push to main or manual run"]
74
+ dbuild["job: build<br/>Python 3.12, uv sync --only-group docs<br/>zensical build --strict<br/>not a PR: upload site/"]
75
+ deploy["job: deploy (skipped on PRs)<br/>actions/deploy-pages, environment 'github-pages'"]
76
+ dbuild -->|"push or manual run"| deploy
77
+ end
67
78
  ```
68
79
 
69
80
  ## Jobs in detail
@@ -72,7 +83,7 @@ flowchart TD
72
83
 
73
84
  | Job | Runs on | Steps | Notes |
74
85
  | --- | --- | --- | --- |
75
- | `test` | ubuntu, macos, windows × Python 3.11–3.15 (15 runs) | `uv sync`, `pytest -m "not mpi and not mpi_subprocess"`, `ruff check .`, `mypy` | `fail-fast: false`, so one failing combination does not cancel the others. `addopts` in `pyproject.toml` adds the 70% coverage gate. Native MPI is only required in `test-mpi`. |
86
+ | `test` | ubuntu, macos, windows × Python 3.11–3.15 (15 runs) | `uv sync`, `pytest -m "not mpi and not mpi_subprocess" --cov-report=xml`, `ruff check .`, `mypy`; on ubuntu + Python 3.12 only, `codecov/codecov-action` uploads `coverage.xml` (secret `CODECOV_TOKEN`, `fail_ci_if_error: false`) | `fail-fast: false`, so one failing combination does not cancel the others. `addopts` in `pyproject.toml` adds the 70% coverage gate. Native MPI is only required in `test-mpi`. |
76
87
  | `test-mpi` | Python 3.12; ubuntu with Open MPI/MPICH/Intel MPI, macos with Open MPI/MPICH, windows with Microsoft MPI/Intel MPI (7 runs) | `mpi4py/setup-mpi`, `uv sync --extra mpi`, verify the runtime vendor, full MPI suite with 4 ranks, `tests/test_mpi_rank_scaling.py` with 8 ranks, then `pytest -m mpi_subprocess` | `fail-fast: false`. Existing integration tests require 4 ranks; the scaling tests run at both 4 and 8 ranks. Subprocess tests launch their own four-rank jobs outside `mpiexec`. |
77
88
 
78
89
  Permissions are read-only (`contents: read`).
@@ -114,9 +125,22 @@ Release ran on (`workflow_run.head_sha`), builds with `python -m build`, validat
114
125
  uploads with `pypa/gh-action-pypi-publish`. There is no API token in the workflow: it uses the `pypi` environment and
115
126
  an OIDC token (`id-token: write`), i.e. PyPI trusted publishing.
116
127
 
128
+ ### Docs ([docs.yml](../.github/workflows/docs.yml))
129
+
130
+ Runs on pull requests into `main`, on every push to `main` and on manual dispatch. Concurrency is grouped per ref
131
+ (`docs-<ref>`): a new commit on a PR cancels the PR's previous run, while deployments from `main` queue. The `build`
132
+ job (`contents: read`) installs only the `docs` dependency group and builds the site with
133
+ [Zensical](https://zensical.org), which reads `mkdocs.yml`, using `zensical build --strict` (a missing README snippet
134
+ fails the run; unlike MkDocs, Zensical 0.1 does not report broken relative links). On pull requests that is the whole
135
+ check. Otherwise it uploads `site/` with `actions/upload-pages-artifact`, and the `deploy` job (`pages: write`,
136
+ `id-token: write`) publishes it with `actions/deploy-pages` in the `github-pages` environment. The site's pages pull their text from `README.md` and
137
+ `CHANGELOG.md` through snippet markers, and the API reference from the `parameterrun` docstring.
138
+
117
139
  ## What this means in practice
118
140
 
119
- - **CI only runs on pull requests into `main`.** Pushes to `dev` or feature branches are not tested by GitHub Actions.
141
+ - **CI runs only on pull requests into `main`**, not again after the merge. The README badges follow the PR runs: the
142
+ CI badge filters on `event=pull_request`, and the Codecov badge shows the `dev` branch, which PR uploads are filed
143
+ under. Pushes to `dev` or feature branches are not tested by GitHub Actions.
120
144
  - **Every merge into `main` is a release.** If `__version__` was not bumped, Release fails at step 2 and nothing is
121
145
  published. If the `CHANGELOG.md` section is missing, it fails at step 3. Before merging: run
122
146
  `python scripts/bump_version.py …` and move the `[Unreleased]` entries under `## [X.Y.Z] - date`.
@@ -0,0 +1,91 @@
1
+ # Zensical reads this MkDocs-format config (https://zensical.org/docs/compatibility/mkdocs/).
2
+ site_name: parameterrun
3
+ site_description: Parallel parameter sweeps for Python with joblib/MPI and tqdm progress bars.
4
+ site_url: https://davtax.github.io/ParameterRun/
5
+ repo_url: https://github.com/Davtax/ParameterRun
6
+ repo_name: Davtax/ParameterRun
7
+ edit_uri: edit/dev/docs/
8
+ copyright: Copyright &copy; David Fernández-Fernández · BSD-3-Clause
9
+
10
+ theme:
11
+ name: material
12
+ logo: assets/logo-mark-dark.svg
13
+ favicon: assets/favicon.svg
14
+ icon:
15
+ repo: fontawesome/brands/github
16
+ font:
17
+ text: Inter
18
+ code: JetBrains Mono
19
+ palette:
20
+ - media: "(prefers-color-scheme: light)"
21
+ scheme: default
22
+ primary: custom
23
+ accent: custom
24
+ toggle:
25
+ icon: material/weather-night
26
+ name: Switch to dark mode
27
+ - media: "(prefers-color-scheme: dark)"
28
+ scheme: slate
29
+ primary: custom
30
+ accent: custom
31
+ toggle:
32
+ icon: material/weather-sunny
33
+ name: Switch to light mode
34
+ features:
35
+ - navigation.instant
36
+ - navigation.tracking
37
+ - navigation.sections
38
+ - navigation.top
39
+ - navigation.footer
40
+ - content.code.copy
41
+ - search.suggest
42
+ - search.highlight
43
+
44
+ extra_css:
45
+ - assets/extra.css
46
+
47
+ nav:
48
+ - Home: index.md
49
+ - Quick start: quickstart.md
50
+ - User guide:
51
+ - Parallel backends: guide/backends.md
52
+ - Saving results and checkpoints: guide/results.md
53
+ - Errors and validation: guide/errors.md
54
+ - Progress bars: guide/progress.md
55
+ - API reference: reference.md
56
+ - Changelog: changelog.md
57
+ - Contributing: contributing.md
58
+
59
+ plugins:
60
+ - search
61
+ - mkdocstrings:
62
+ handlers:
63
+ python:
64
+ paths: [src]
65
+ options:
66
+ docstring_style: numpy
67
+ show_root_heading: true
68
+ show_source: false
69
+ show_signature_annotations: true
70
+ separate_signature: true
71
+ heading_level: 2
72
+
73
+ markdown_extensions:
74
+ - admonition
75
+ - attr_list
76
+ - md_in_html
77
+ - tables
78
+ - toc:
79
+ permalink: true
80
+ - pymdownx.details
81
+ - pymdownx.highlight:
82
+ anchor_linenums: true
83
+ - pymdownx.inlinehilite
84
+ - pymdownx.snippets:
85
+ base_path: ["."]
86
+ check_paths: true
87
+ - pymdownx.superfences:
88
+ custom_fences:
89
+ - name: mermaid
90
+ class: mermaid
91
+ format: !!python/name:pymdownx.superfences.fence_code_format
@@ -1,12 +1,11 @@
1
1
  [build-system]
2
- requires = ["hatchling>=1.27"]
2
+ requires = ["hatchling>=1.27", "hatch-fancy-pypi-readme>=24.1"]
3
3
  build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "parameterrun"
7
- dynamic = ["version"]
7
+ dynamic = ["version", "readme"]
8
8
  description = "Parallel parameter sweeps with joblib/MPI and tqdm progress bars."
9
- readme = "README.md"
10
9
  license = "BSD-3-Clause"
11
10
  authors = [
12
11
  { name = "David Fernández-Fernández", email = "david.fernandezf@hotmail.com" }
@@ -36,6 +35,7 @@ dependencies = [
36
35
 
37
36
  [project.urls]
38
37
  Homepage = "https://github.com/Davtax/ParameterRun"
38
+ Documentation = "https://davtax.github.io/ParameterRun/"
39
39
  Repository = "https://github.com/Davtax/ParameterRun"
40
40
  Issues = "https://github.com/Davtax/ParameterRun/issues"
41
41
  Changelog = "https://github.com/Davtax/ParameterRun/blob/main/CHANGELOG.md"
@@ -46,6 +46,11 @@ mpi = [
46
46
  ]
47
47
 
48
48
  [dependency-groups]
49
+ docs = [
50
+ "zensical>=0.1",
51
+ "mkdocstrings[python]>=0.26",
52
+ "ruff>=0.11",
53
+ ]
49
54
  bench = [
50
55
  "ipykernel>=6.29",
51
56
  "matplotlib>=3.8",
@@ -58,7 +63,7 @@ dev = [
58
63
  "ruff>=0.11",
59
64
  "mypy>=1.10",
60
65
  "build>=1.2",
61
- "twine>=6",
66
+ "twine>=7",
62
67
  "pydevd-pycharm>=261.23567.174",
63
68
  "psutil>=7.2.2",
64
69
  "scalene>=2.2.1",
@@ -71,6 +76,20 @@ pattern = '__version__ = "(?P<version>[^"]+)"'
71
76
  [tool.hatch.build.targets.wheel]
72
77
  packages = ["src/parameterrun"]
73
78
 
79
+ [tool.hatch.build.targets.sdist]
80
+ exclude = ["/logo"]
81
+
82
+ # README uses relative image paths (work on GitHub and in local previews); PyPI needs absolute URLs.
83
+ [tool.hatch.metadata.hooks.fancy-pypi-readme]
84
+ content-type = "text/markdown"
85
+
86
+ [[tool.hatch.metadata.hooks.fancy-pypi-readme.fragments]]
87
+ path = "README.md"
88
+
89
+ [[tool.hatch.metadata.hooks.fancy-pypi-readme.substitutions]]
90
+ pattern = '(src|srcset)="logo/'
91
+ replacement = '\1="https://raw.githubusercontent.com/Davtax/ParameterRun/main/logo/'
92
+
74
93
  [tool.pytest.ini_options]
75
94
  testpaths = ["tests"]
76
95
  addopts = "-q --cov=parameterrun --cov-report=term-missing --cov-fail-under=70"
@@ -1,4 +1,4 @@
1
- __version__ = "0.5.0"
1
+ __version__ = "0.5.2"
2
2
 
3
3
  from .parallel_utils import parameterrun
4
4
 
File without changes