seqpro 0.19.0__tar.gz → 0.19.1__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 (151) hide show
  1. {seqpro-0.19.0 → seqpro-0.19.1}/.github/workflows/publish.yaml +47 -1
  2. {seqpro-0.19.0 → seqpro-0.19.1}/CHANGELOG.md +2 -0
  3. {seqpro-0.19.0 → seqpro-0.19.1}/PKG-INFO +1 -1
  4. seqpro-0.19.1/crates/seqpro-core/Cargo.toml +20 -0
  5. {seqpro-0.19.0 → seqpro-0.19.1}/pyproject.toml +1 -1
  6. seqpro-0.19.0/crates/seqpro-core/Cargo.toml +0 -14
  7. {seqpro-0.19.0 → seqpro-0.19.1}/.claude/skills/zensical/SKILL.md +0 -0
  8. {seqpro-0.19.0 → seqpro-0.19.1}/.gitattributes +0 -0
  9. {seqpro-0.19.0 → seqpro-0.19.1}/.github/workflows/bench.yaml +0 -0
  10. {seqpro-0.19.0 → seqpro-0.19.1}/.github/workflows/bump.yaml +0 -0
  11. {seqpro-0.19.0 → seqpro-0.19.1}/.github/workflows/docs.yml +0 -0
  12. {seqpro-0.19.0 → seqpro-0.19.1}/.github/workflows/lint.yaml +0 -0
  13. {seqpro-0.19.0 → seqpro-0.19.1}/.github/workflows/merge.yaml +0 -0
  14. {seqpro-0.19.0 → seqpro-0.19.1}/.github/workflows/release-pipeline.yaml +0 -0
  15. {seqpro-0.19.0 → seqpro-0.19.1}/.github/workflows/release.yaml +0 -0
  16. {seqpro-0.19.0 → seqpro-0.19.1}/.github/workflows/test.yaml +0 -0
  17. {seqpro-0.19.0 → seqpro-0.19.1}/.gitignore +0 -0
  18. {seqpro-0.19.0 → seqpro-0.19.1}/.pre-commit-config.yaml +0 -0
  19. {seqpro-0.19.0 → seqpro-0.19.1}/CLAUDE.md +0 -0
  20. {seqpro-0.19.0 → seqpro-0.19.1}/Cargo.lock +0 -0
  21. {seqpro-0.19.0 → seqpro-0.19.1}/Cargo.toml +0 -0
  22. {seqpro-0.19.0 → seqpro-0.19.1}/LICENSE +0 -0
  23. {seqpro-0.19.0 → seqpro-0.19.1}/README.md +0 -0
  24. {seqpro-0.19.0 → seqpro-0.19.1}/benches/bench_tokenize_translate.py +0 -0
  25. {seqpro-0.19.0 → seqpro-0.19.1}/benches/kshuffle.rs +0 -0
  26. {seqpro-0.19.0 → seqpro-0.19.1}/benchmarks/bench_ragged_backends.py +0 -0
  27. {seqpro-0.19.0 → seqpro-0.19.1}/benchmarks/bench_to_packed.py +0 -0
  28. {seqpro-0.19.0 → seqpro-0.19.1}/crates/seqpro-core/src/lib.rs +0 -0
  29. {seqpro-0.19.0 → seqpro-0.19.1}/crates/seqpro-core/src/ragged.rs +0 -0
  30. {seqpro-0.19.0 → seqpro-0.19.1}/docs/api/alphabets.md +0 -0
  31. {seqpro-0.19.0 → seqpro-0.19.1}/docs/api/bed.md +0 -0
  32. {seqpro-0.19.0 → seqpro-0.19.1}/docs/api/gtf.md +0 -0
  33. {seqpro-0.19.0 → seqpro-0.19.1}/docs/api/index.md +0 -0
  34. {seqpro-0.19.0 → seqpro-0.19.1}/docs/api/ragged.md +0 -0
  35. {seqpro-0.19.0 → seqpro-0.19.1}/docs/api/types.md +0 -0
  36. {seqpro-0.19.0 → seqpro-0.19.1}/docs/index.md +0 -0
  37. {seqpro-0.19.0 → seqpro-0.19.1}/docs/ragged.md +0 -0
  38. {seqpro-0.19.0 → seqpro-0.19.1}/docs/roadmap/rust-ragged.md +0 -0
  39. {seqpro-0.19.0 → seqpro-0.19.1}/docs/superpowers/plans/2026-05-04-ragged-record-array.md +0 -0
  40. {seqpro-0.19.0 → seqpro-0.19.1}/docs/superpowers/plans/2026-05-05-documentation-site.md +0 -0
  41. {seqpro-0.19.0 → seqpro-0.19.1}/docs/superpowers/plans/2026-05-05-narwhals-coord-schema.md +0 -0
  42. {seqpro-0.19.0 → seqpro-0.19.1}/docs/superpowers/plans/2026-05-05-ragged-zip-and-record-introspection.md +0 -0
  43. {seqpro-0.19.0 → seqpro-0.19.1}/docs/superpowers/plans/2026-05-20-kshuffle-optimization.md +0 -0
  44. {seqpro-0.19.0 → seqpro-0.19.1}/docs/superpowers/plans/2026-05-20-kshuffle-pooled-buffers-and-k2-fast-path.md +0 -0
  45. {seqpro-0.19.0 → seqpro-0.19.1}/docs/superpowers/plans/2026-05-20-kshuffle-wilson-single-pass.md +0 -0
  46. {seqpro-0.19.0 → seqpro-0.19.1}/docs/superpowers/plans/2026-05-20-release-pipeline.md +0 -0
  47. {seqpro-0.19.0 → seqpro-0.19.1}/docs/superpowers/plans/2026-05-28-translate-lut-validation.md +0 -0
  48. {seqpro-0.19.0 → seqpro-0.19.1}/docs/superpowers/plans/2026-05-31-flat-buffer-to-padded.md +0 -0
  49. {seqpro-0.19.0 → seqpro-0.19.1}/docs/superpowers/plans/2026-05-31-rag-to-packed.md +0 -0
  50. {seqpro-0.19.0 → seqpro-0.19.1}/docs/superpowers/plans/2026-06-05-translate-unknown-codon-policy.md +0 -0
  51. {seqpro-0.19.0 → seqpro-0.19.1}/docs/superpowers/plans/2026-06-12-tokenize-lut-codspeed.md +0 -0
  52. {seqpro-0.19.0 → seqpro-0.19.1}/docs/superpowers/plans/2026-06-18-rust-tokenize-translate.md +0 -0
  53. {seqpro-0.19.0 → seqpro-0.19.1}/docs/superpowers/plans/2026-06-19-rust-ragged-core.md +0 -0
  54. {seqpro-0.19.0 → seqpro-0.19.1}/docs/superpowers/plans/2026-06-20-rust-ragged-records.md +0 -0
  55. {seqpro-0.19.0 → seqpro-0.19.1}/docs/superpowers/plans/2026-06-20-rust-ragged-spec-c.md +0 -0
  56. {seqpro-0.19.0 → seqpro-0.19.1}/docs/superpowers/plans/2026-06-21-ragged-throughput-gate.md +0 -0
  57. {seqpro-0.19.0 → seqpro-0.19.1}/docs/superpowers/plans/2026-06-21-rust-ragged-consumer-audit.md +0 -0
  58. {seqpro-0.19.0 → seqpro-0.19.1}/docs/superpowers/plans/2026-06-23-ragged-subclass-getitem.md +0 -0
  59. {seqpro-0.19.0 → seqpro-0.19.1}/docs/superpowers/specs/2026-05-04-ragged-record-array-design.md +0 -0
  60. {seqpro-0.19.0 → seqpro-0.19.1}/docs/superpowers/specs/2026-05-05-documentation-site-design.md +0 -0
  61. {seqpro-0.19.0 → seqpro-0.19.1}/docs/superpowers/specs/2026-05-05-narwhals-coord-schema-design.md +0 -0
  62. {seqpro-0.19.0 → seqpro-0.19.1}/docs/superpowers/specs/2026-05-05-ragged-zip-and-record-introspection-design.md +0 -0
  63. {seqpro-0.19.0 → seqpro-0.19.1}/docs/superpowers/specs/2026-05-20-kshuffle-optimization-design.md +0 -0
  64. {seqpro-0.19.0 → seqpro-0.19.1}/docs/superpowers/specs/2026-05-20-kshuffle-pooled-buffers-and-k2-fast-path-design.md +0 -0
  65. {seqpro-0.19.0 → seqpro-0.19.1}/docs/superpowers/specs/2026-05-20-kshuffle-wilson-single-pass-design.md +0 -0
  66. {seqpro-0.19.0 → seqpro-0.19.1}/docs/superpowers/specs/2026-05-20-release-pipeline-design.md +0 -0
  67. {seqpro-0.19.0 → seqpro-0.19.1}/docs/superpowers/specs/2026-05-28-translate-lut-and-validation-design.md +0 -0
  68. {seqpro-0.19.0 → seqpro-0.19.1}/docs/superpowers/specs/2026-05-31-flat-buffer-to-padded-design.md +0 -0
  69. {seqpro-0.19.0 → seqpro-0.19.1}/docs/superpowers/specs/2026-05-31-rag-to-packed-design.md +0 -0
  70. {seqpro-0.19.0 → seqpro-0.19.1}/docs/superpowers/specs/2026-06-05-translate-unknown-codon-policy-design.md +0 -0
  71. {seqpro-0.19.0 → seqpro-0.19.1}/docs/superpowers/specs/2026-06-12-tokenize-lut-codspeed-design.md +0 -0
  72. {seqpro-0.19.0 → seqpro-0.19.1}/docs/superpowers/specs/2026-06-18-rust-tokenize-translate-design.md +0 -0
  73. {seqpro-0.19.0 → seqpro-0.19.1}/docs/superpowers/specs/2026-06-19-rust-ragged-core-design.md +0 -0
  74. {seqpro-0.19.0 → seqpro-0.19.1}/docs/superpowers/specs/2026-06-20-rust-ragged-nested-design.md +0 -0
  75. {seqpro-0.19.0 → seqpro-0.19.1}/docs/superpowers/specs/2026-06-20-rust-ragged-records-design.md +0 -0
  76. {seqpro-0.19.0 → seqpro-0.19.1}/docs/superpowers/specs/2026-06-21-ragged-throughput-gate-design.md +0 -0
  77. {seqpro-0.19.0 → seqpro-0.19.1}/docs/superpowers/specs/2026-06-21-rust-ragged-audit-ledger.md +0 -0
  78. {seqpro-0.19.0 → seqpro-0.19.1}/docs/superpowers/specs/2026-06-21-rust-ragged-consumer-audit-design.md +0 -0
  79. {seqpro-0.19.0 → seqpro-0.19.1}/docs/superpowers/specs/2026-06-23-ragged-subclass-getitem-design.md +0 -0
  80. {seqpro-0.19.0 → seqpro-0.19.1}/meta.yaml +0 -0
  81. {seqpro-0.19.0 → seqpro-0.19.1}/pixi.lock +0 -0
  82. {seqpro-0.19.0 → seqpro-0.19.1}/pixi.toml +0 -0
  83. {seqpro-0.19.0 → seqpro-0.19.1}/python/seqpro/__init__.py +0 -0
  84. {seqpro-0.19.0 → seqpro-0.19.1}/python/seqpro/_analyzers.py +0 -0
  85. {seqpro-0.19.0 → seqpro-0.19.1}/python/seqpro/_cleaners.py +0 -0
  86. {seqpro-0.19.0 → seqpro-0.19.1}/python/seqpro/_coords.py +0 -0
  87. {seqpro-0.19.0 → seqpro-0.19.1}/python/seqpro/_encoders.py +0 -0
  88. {seqpro-0.19.0 → seqpro-0.19.1}/python/seqpro/_modifiers.py +0 -0
  89. {seqpro-0.19.0 → seqpro-0.19.1}/python/seqpro/_numba.py +0 -0
  90. {seqpro-0.19.0 → seqpro-0.19.1}/python/seqpro/_types.py +0 -0
  91. {seqpro-0.19.0 → seqpro-0.19.1}/python/seqpro/_utils.py +0 -0
  92. {seqpro-0.19.0 → seqpro-0.19.1}/python/seqpro/alphabets/__init__.py +0 -0
  93. {seqpro-0.19.0 → seqpro-0.19.1}/python/seqpro/alphabets/_alphabets.py +0 -0
  94. {seqpro-0.19.0 → seqpro-0.19.1}/python/seqpro/bed.py +0 -0
  95. {seqpro-0.19.0 → seqpro-0.19.1}/python/seqpro/experimental/_experimental.py +0 -0
  96. {seqpro-0.19.0 → seqpro-0.19.1}/python/seqpro/experimental/_visualizers.py +0 -0
  97. {seqpro-0.19.0 → seqpro-0.19.1}/python/seqpro/gtf.py +0 -0
  98. {seqpro-0.19.0 → seqpro-0.19.1}/python/seqpro/py.typed +0 -0
  99. {seqpro-0.19.0 → seqpro-0.19.1}/python/seqpro/rag/__init__.py +0 -0
  100. {seqpro-0.19.0 → seqpro-0.19.1}/python/seqpro/rag/_ak_interop.py +0 -0
  101. {seqpro-0.19.0 → seqpro-0.19.1}/python/seqpro/rag/_core.py +0 -0
  102. {seqpro-0.19.0 → seqpro-0.19.1}/python/seqpro/rag/_ingest.py +0 -0
  103. {seqpro-0.19.0 → seqpro-0.19.1}/python/seqpro/rag/_layout.py +0 -0
  104. {seqpro-0.19.0 → seqpro-0.19.1}/python/seqpro/rag/_ops.py +0 -0
  105. {seqpro-0.19.0 → seqpro-0.19.1}/python/seqpro/rag/_types.py +0 -0
  106. {seqpro-0.19.0 → seqpro-0.19.1}/python/seqpro/rag/_utils.py +0 -0
  107. {seqpro-0.19.0 → seqpro-0.19.1}/python/seqpro/transforms/__init__.py +0 -0
  108. {seqpro-0.19.0 → seqpro-0.19.1}/python/seqpro/transforms/augmentation.py +0 -0
  109. {seqpro-0.19.0 → seqpro-0.19.1}/python/seqpro/transforms/tmm.py +0 -0
  110. {seqpro-0.19.0 → seqpro-0.19.1}/python/seqpro/xr/__init__.py +0 -0
  111. {seqpro-0.19.0 → seqpro-0.19.1}/scratch_bench_rc.py +0 -0
  112. {seqpro-0.19.0 → seqpro-0.19.1}/scratch_bench_to_padded.py +0 -0
  113. {seqpro-0.19.0 → seqpro-0.19.1}/skills/seqpro/SKILL.md +0 -0
  114. {seqpro-0.19.0 → seqpro-0.19.1}/src/kmer_encode.rs +0 -0
  115. {seqpro-0.19.0 → seqpro-0.19.1}/src/kshuffle.rs +0 -0
  116. {seqpro-0.19.0 → seqpro-0.19.1}/src/kshuffle_ref.rs +0 -0
  117. {seqpro-0.19.0 → seqpro-0.19.1}/src/lib.rs +0 -0
  118. {seqpro-0.19.0 → seqpro-0.19.1}/src/ragged.rs +0 -0
  119. {seqpro-0.19.0 → seqpro-0.19.1}/src/translate.rs +0 -0
  120. {seqpro-0.19.0 → seqpro-0.19.1}/tests/_shape_fixtures.py +0 -0
  121. {seqpro-0.19.0 → seqpro-0.19.1}/tests/bed/test_pyranges.py +0 -0
  122. {seqpro-0.19.0 → seqpro-0.19.1}/tests/bed/test_read.py +0 -0
  123. {seqpro-0.19.0 → seqpro-0.19.1}/tests/bed/test_sort.py +0 -0
  124. {seqpro-0.19.0 → seqpro-0.19.1}/tests/bed/test_with_length.py +0 -0
  125. {seqpro-0.19.0 → seqpro-0.19.1}/tests/bench_translate_lut.py +0 -0
  126. {seqpro-0.19.0 → seqpro-0.19.1}/tests/conftest.py +0 -0
  127. {seqpro-0.19.0 → seqpro-0.19.1}/tests/test_analyzers.py +0 -0
  128. {seqpro-0.19.0 → seqpro-0.19.1}/tests/test_bench_tokenize.py +0 -0
  129. {seqpro-0.19.0 → seqpro-0.19.1}/tests/test_concatenate.py +0 -0
  130. {seqpro-0.19.0 → seqpro-0.19.1}/tests/test_coords.py +0 -0
  131. {seqpro-0.19.0 → seqpro-0.19.1}/tests/test_core_ragged_surface.py +0 -0
  132. {seqpro-0.19.0 → seqpro-0.19.1}/tests/test_encoders.py +0 -0
  133. {seqpro-0.19.0 → seqpro-0.19.1}/tests/test_ingest.py +0 -0
  134. {seqpro-0.19.0 → seqpro-0.19.1}/tests/test_modifiers.py +0 -0
  135. {seqpro-0.19.0 → seqpro-0.19.1}/tests/test_ohe.py +0 -0
  136. {seqpro-0.19.0 → seqpro-0.19.1}/tests/test_rag_to_packed.py +0 -0
  137. {seqpro-0.19.0 → seqpro-0.19.1}/tests/test_ragged.py +0 -0
  138. {seqpro-0.19.0 → seqpro-0.19.1}/tests/test_ragged_core.py +0 -0
  139. {seqpro-0.19.0 → seqpro-0.19.1}/tests/test_ragged_core_records.py +0 -0
  140. {seqpro-0.19.0 → seqpro-0.19.1}/tests/test_ragged_nested_consumers.py +0 -0
  141. {seqpro-0.19.0 → seqpro-0.19.1}/tests/test_ragged_nested_diff.py +0 -0
  142. {seqpro-0.19.0 → seqpro-0.19.1}/tests/test_ragged_rc.py +0 -0
  143. {seqpro-0.19.0 → seqpro-0.19.1}/tests/test_ragged_record_indexing.py +0 -0
  144. {seqpro-0.19.0 → seqpro-0.19.1}/tests/test_ragged_subclass.py +0 -0
  145. {seqpro-0.19.0 → seqpro-0.19.1}/tests/test_ragged_to_padded.py +0 -0
  146. {seqpro-0.19.0 → seqpro-0.19.1}/tests/test_shape_matrix.py +0 -0
  147. {seqpro-0.19.0 → seqpro-0.19.1}/tests/test_tokenize.py +0 -0
  148. {seqpro-0.19.0 → seqpro-0.19.1}/tests/test_transforms.py +0 -0
  149. {seqpro-0.19.0 → seqpro-0.19.1}/tests/test_translate.py +0 -0
  150. {seqpro-0.19.0 → seqpro-0.19.1}/tests/test_translate_rust.py +0 -0
  151. {seqpro-0.19.0 → seqpro-0.19.1}/zensical.toml +0 -0
@@ -9,7 +9,9 @@
9
9
  # conditions below. Re-apply the workflow_call inputs (`dry_run`), delete
10
10
  # the `on.workflow_run` block, remove all `if: ${{ github.event_name ... }}`
11
11
  # guards, and wrap the `uv publish` step with the dry_run gate before
12
- # committing.
12
+ # committing. Also re-add the hand-written `crates-io` job at the bottom
13
+ # (maturin does not generate it) — it publishes the pyo3-free seqpro-core
14
+ # crate to crates.io on a version bump.
13
15
  name: Publish
14
16
 
15
17
  on:
@@ -268,3 +270,47 @@ jobs:
268
270
  echo
269
271
  ls -1 wheels-*/* | sed 's/^/- /'
270
272
  } >> "$GITHUB_STEP_SUMMARY"
273
+
274
+ # Publish the pyo3-free seqpro-core crate to crates.io. Bump-detected and
275
+ # idempotent: it reads the version from crates/seqpro-core/Cargo.toml and
276
+ # publishes only when that version is not already on crates.io, so an
277
+ # unchanged version is a no-op (success), and bumping the crate's version is
278
+ # what triggers a release. Independent of the Python wheel/PyPI publish above.
279
+ crates-io:
280
+ name: Publish seqpro-core to crates.io
281
+ runs-on: ubuntu-latest
282
+ steps:
283
+ - uses: actions/checkout@v6
284
+ with:
285
+ ref: ${{ inputs.tag }}
286
+ - name: Install Rust
287
+ uses: dtolnay/rust-toolchain@stable
288
+ - name: Detect seqpro-core version and whether it is already published
289
+ id: ver
290
+ run: |
291
+ version=$(grep -m1 '^version' crates/seqpro-core/Cargo.toml \
292
+ | sed -E 's/version *= *"([^"]+)".*/\1/')
293
+ if [ -z "$version" ]; then
294
+ echo "::error::could not read seqpro-core version from crates/seqpro-core/Cargo.toml"
295
+ exit 1
296
+ fi
297
+ echo "version=$version" >> "$GITHUB_OUTPUT"
298
+ # crates.io requires a descriptive User-Agent or it returns 403.
299
+ code=$(curl -s -o /dev/null -w '%{http_code}' \
300
+ -H 'User-Agent: seqpro-release-pipeline (https://github.com/ML4GLand/SeqPro)' \
301
+ "https://crates.io/api/v1/crates/seqpro-core/$version")
302
+ if [ "$code" = "200" ]; then
303
+ echo "published=true" >> "$GITHUB_OUTPUT"
304
+ echo "seqpro-core $version is already on crates.io — no bump detected, skipping." >> "$GITHUB_STEP_SUMMARY"
305
+ else
306
+ echo "published=false" >> "$GITHUB_OUTPUT"
307
+ echo "seqpro-core $version not found on crates.io (HTTP $code) — will publish." >> "$GITHUB_STEP_SUMMARY"
308
+ fi
309
+ - name: Dry-run publish
310
+ if: inputs.dry_run == true && steps.ver.outputs.published == 'false'
311
+ run: cargo publish -p seqpro-core --dry-run
312
+ - name: Publish to crates.io
313
+ if: inputs.dry_run == false && steps.ver.outputs.published == 'false'
314
+ env:
315
+ CARGO_REGISTRY_TOKEN: ${{ secrets.CRATES_IO }}
316
+ run: cargo publish -p seqpro-core
@@ -1,3 +1,5 @@
1
+ ## 0.19.1 (2026-06-23)
2
+
1
3
  ## 0.19.0 (2026-06-23)
2
4
 
3
5
  ### Feat
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: seqpro
3
- Version: 0.19.0
3
+ Version: 0.19.1
4
4
  Classifier: Programming Language :: Rust
5
5
  Classifier: Programming Language :: Python :: Implementation :: CPython
6
6
  Classifier: Programming Language :: Python :: Implementation :: PyPy
@@ -0,0 +1,20 @@
1
+ [package]
2
+ name = "seqpro-core"
3
+ version = "0.1.0"
4
+ edition = "2021"
5
+ description = "pyo3-free Rust kernels for seqpro's ragged (offsets+data) sequence arrays."
6
+ license = "MIT"
7
+ repository = "https://github.com/ML4GLand/SeqPro"
8
+ readme = false
9
+ keywords = ["bioinformatics", "genomics", "ragged", "sequences"]
10
+ categories = ["science", "data-structures"]
11
+
12
+ [lib]
13
+ name = "seqpro_core"
14
+
15
+ [dependencies]
16
+ ndarray = { version = "0.17", features = ["rayon"] }
17
+ rayon = "1.11.0"
18
+
19
+ [dev-dependencies]
20
+ proptest = "1.4"
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "seqpro"
3
- version = "0.19.0"
3
+ version = "0.19.1"
4
4
  authors = [
5
5
  { name = "David Laub", email = "dlaub@ucsd.edu" },
6
6
  { name = "Adam Klie", email = "aklie@ucsd.edu" },
@@ -1,14 +0,0 @@
1
- [package]
2
- name = "seqpro-core"
3
- version = "0.1.0"
4
- edition = "2021"
5
-
6
- [lib]
7
- name = "seqpro_core"
8
-
9
- [dependencies]
10
- ndarray = { version = "0.17", features = ["rayon"] }
11
- rayon = "1.11.0"
12
-
13
- [dev-dependencies]
14
- proptest = "1.4"
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes