Commit d12979f
authored
feat: v0.5.0 — Nextflow DSL2 post-calling pipeline (27 modules)
* feat: v0.5.0 — Nextflow DSL2 scaffold with PharmCAT and ClinVar modules
Add Nextflow execution path alongside existing bash scripts. This is
the architecture validation PR (PR 1a) for the Nextflow conversion:
- main.nf entry point with samplesheet parsing and channel branching
- PharmCAT module (preprocess + star allele calling, 2-step process)
- ClinVar screen module (PASS filter + bcftools isec intersection)
- PGX workflow composing both modules in parallel (fan-out pattern)
- nextflow.config with Docker/Singularity profiles and resource limits
- nextflow_schema.json for parameter validation
- conf/base.config with process labels (low/medium/high)
- conf/test.config and conf/test_full.config profiles
- .nf-core.yml lint configuration (external pipeline, skip branding)
- Samplesheet schema accepting sarek output (VCF+BAM)
- docs/nextflow.md with quickstart, sarek integration, bash comparison
- ROADMAP updated with Nextflow vs Snakemake rationale and staged PRs
- README updated with Nextflow badge and quickstart section
Bash scripts remain first-class — this adds a parallel execution path
for bioinformaticians who want DAG parallelism, resume, and HPC support.
* fix: address review findings — stubs, normalization, CI, docs
- Add stub blocks to all 3 Nextflow processes for -stub dry runs
- Add stub test data (reference, VCF) and fix test.config to be
self-contained with reference param
- Add VCF left-normalization (bcftools norm) before ClinVar isec to
prevent representation-sensitive misses
- Add Nextflow CI workflow (config validation, syntax check, container
tag consistency with versions.env)
- Tone down ClinVar docs: "pathogenic hits" → "positions overlapping
ClinVar pathogenic entries", add limitations section about review
status, conflict flags, and research-grade disclaimer
- Clarify ROADMAP: PR 1a is alpha scaffold (not usable execution path),
PR 3 SV scope for standalone users only, bash scripts stay in
scripts/ (no legacy/ move)
* fix: CPIC report now surfaces uncallable genes explicitly
- No Result/N/A/Indeterminate genes no longer silently dropped —
they appear in gene results table and in a new "Uncallable Genes"
section at the end of the report
- Docs: "require no dosing changes" → "no dosing adjustment signal
detected from currently callable variants" with note that absence
from recommendations ≠ normal function
* fix: address second-round review findings
- CPIC: detect PharmCAT parse failure before uncalled genes section,
preventing false "all genes successfully called" on NO_JSON_FOUND
- Nextflow CI: add stub test run (nextflow run -profile test,docker -stub)
so module wiring is actually exercised in CI
- Container tag drift guard: read from temp file instead of piped
subshell so FAIL=1 propagates correctly
- Align Nextflow messaging: README and docs/nextflow.md now say
"alpha scaffold" matching ROADMAP, not "runnable alternative"
* feat(pgx): add PyPGx and CPIC lookup modules
PyPGx: BAM-based star allele calling for CYP2D6/CYP2A6/GSTM1/GSTT1
with SV detection. CPIC: parses PharmCAT JSON for drug-gene
recommendations using built-in static CPIC guideline table.
Both gated on params.tools.
* feat(annotation): add VEP, vcfanno, slivar, clinical filter modules
Sequential pipeline: VEP → vcfanno (CADD/SpliceAI/REVEL/AlphaMissense)
→ slivar (prioritization + compound hets) / clinical_filter (parallel).
Handles chr-prefix mismatch via two-pass vcfanno annotation.
* feat(clinical): add CPSR, ROH, PRS, ancestry, mito haplogroup modules
Cancer predisposition (CPSR/PCGR), runs of homozygosity (bcftools),
polygenic risk scores (plink2), ancestry PCA, and mitochondrial
haplogroup classification (bcftools extract → haplogrep3).
All gated on params.tools. Mito uses two-step VCF-based approach.
* feat(bam_analysis): add HLA, STR, telomere, coverage, mito, CYP2D6 modules
Six parallel BAM-based analyses: T1K HLA typing, ExpansionHunter STR
detection, TelomereHunter length estimation, mosdepth coverage stats,
GATK Mutect2 mitochondrial variants, and Cyrius CYP2D6 star alleles.
* feat(sv): add Manta, Delly, CNVnator, duphold, AnnotSV, SURVIVOR modules
Opt-in SV workflow: three callers in parallel (Manta, Delly, CNVnator),
duphold depth annotation on Manta output, AnnotSV ACMG classification,
and bcftools-based consensus merge requiring 2+ caller support.
* feat(reporting): add HTML report and MultiQC modules
Per-sample consolidated HTML report (ClinVar, PharmCAT, CPSR, slivar,
clinical filter status) and cross-sample MultiQC QC dashboard.
Both gated on params.tools.
* feat: wire all 6 workflows into main.nf with --tools parameter
Orchestrates PGX, ANNOTATION, CLINICAL, BAM_ANALYSIS, SV, and REPORTING
workflows from main.nf. Adds params.tools (sarek-style comma-separated
tool gating), 20+ new annotation/reference data params, NO_FILE/EMPTY
sentinel pattern for optional inputs, and stub BAM/FAI/DICT test data.
* fix: replace NO_FILE sentinel with [] to prevent path name collisions
CPSR failed in stub test because pcgr_data and vep_cache_cpsr both
resolved to the same NO_FILE file, causing Nextflow staging collision.
VCFANNO had the same latent issue with 12 optional annotation inputs.
Switch to standard nf-core pattern: pass [] (empty list) for absent
optional path inputs. Processes check truthiness instead of filename.
Also removes redundant .first() on value channels (eliminates 30+
Nextflow warnings).
* fix: disable trace/dag in test profile to fix Docker permission issue
The ensembl-vep image runs as non-root user 'vep'. When trace is enabled,
Nextflow's wrapper creates .command.trace inside the container, but the
non-root user cannot write to the host-owned work directory on GitHub
Actions. Disable trace and dag (needs graphviz) for CI stub tests.
* fix: use touch instead of bgzip/tabix in all stub blocks
Some Docker images (e.g. staphb/bcftools) don't include bgzip/tabix.
Stub blocks only need placeholder files, not valid VCF/index content.
Replace bgzip/tabix with touch across all 12 affected modules.
* fix: disable Nextflow trace/reports in CI via override config
The test.config trace.enabled=false was overridden by the global trace
block in nextflow.config (loaded after profiles). Use -c ci.config in
the CI workflow to ensure overrides take effect last.
* fix: run CI Docker containers as root to fix permission errors
Non-root bioinformatics images (ensembl-vep, telomere_hunter) cannot
write to Nextflow work directories on GitHub Actions runners. Override
with -u 0:0 in CI config.
* fix: address CodeRabbit review findings across 12 files
- Fix haplogrep3 Docker image (genepi/ removed from Hub → jtb114/)
- Fix Cyrius single-quote interpolation bug (echo '${bam}' → "${bam}")
- Add IMPACT guard to clinical_filter (fail fast on unannotated VCF)
- Emit header-only VCF for MODERATE tier when gnomAD AF absent
- Add reference_fai input to CNVnator, remove || true error hiding
- Thread ch_reference_fai into PGX workflow instead of local derivation
- Emit clinvar_dir from PGX and wire into REPORTING
- Add vcf_index to required samplesheet validation
- Add dependency warnings for duphold/annotsv/clinical_filter
- Fix contradictory comment in test_full.config
- Fix Java version range in docs, future tense in ROADMAP
* fix: achieve bash↔nextflow parity for PRS, PyPGx, ancestry, slivar
PRS: fix shell pipeline precedence — `zcat || cat | grep` binds wrong;
wrap in subshell so `(zcat || cat) | grep | awk` chains correctly.
PyPGx: add VCF input alongside BAM (was referencing nonexistent
`${bam.baseName}.vcf.gz`); join BAM+VCF channels in pgx.nf workflow;
link pypgx-bundle to /root/pypgx-bundle for container compatibility.
Ancestry: use ref_panel input for plink2 variant intersection before LD
pruning (was declared but unused); convert VCF to pgen first for
efficient downstream operations; report shared SNP count in summary.
Slivar: add two-pass MODERATE filtering — pass 1 extracts rare
MODERATE via split-vep, pass 2 gates on INFO-level deleteriousness
predictors (CADD>=20, REVEL>=0.5, AlphaMissense, SpliceAI) matching
the bash script's vcfanno-aware behavior. Add gnomAD constraint
enrichment (LOEUF, pLI, mis_z) to summary TSV with CONSTRAINED flag.
* fix: CNVnator PASS marking, CPIC safety, sample ID sanitization
CNVnator: change FILTER=PASS to FILTER=. (unfiltered) since CNVnator
has no confidence filtering — marking all calls as PASS is misleading.
CPIC: exit with error when PharmCAT JSON format is unrecognized instead
of silently producing a reassuring "no affected medications" report.
main.nf: validate sample IDs against [a-zA-Z0-9._-] regex to prevent
shell injection via crafted samplesheet entries.
* docs: update nextflow.md and README for full v0.5.0 coverage
Remove alpha/scaffold language — Nextflow path now covers all 31
pipeline steps across 6 workflows with 24 modules. Update output
structure to show all per-sample directories. Add quick-start command
to README Nextflow section.
* fix: slivar gnomAD constraint enrichment graceful python3 fallback
The slivar biocontainer may not include python3. Check for python3
availability before attempting constraint enrichment; fall back to
simpler summary without LOEUF/pLI/mis_z columns if unavailable.
* fix: address review findings — XSS, schema, contigs, docs
- Escape ClinVar-derived HTML fields (GENEINFO, CLNSIG) in report
- Fix ancestry_ref schema from directory-path to file-path
- Add reference FAI contig headers to survivor_merge VCF output
- Fix ancestry shared count to use actual pvar intersection
- Use versions.env HAPLOGREP3_IMAGE in bash mito script
- Correct 5 publishDir mismatches in docs output tree
- Add BAM requirement footnote to samplesheet docs
- Clarify post-calling scope in README and nextflow docs
- Add Known Limitations & Design Decisions section
* fix: report semantics, HTML hardening, tools consistency
- Rename Slivar card from "Compound-Het / De Novo" to "Variant
Prioritization" — it shows prioritized variants, not compound hets
- Escape all VCF-derived HTML fields (CHROM, REF, ALT, GENEINFO,
CLNSIG) in both Nextflow and bash HTML reports
- Add html_escape helper to bash report for SAMPLE, haplogroup,
telomere, and ExpansionHunter values
- Add .collect{it.trim()} to all --tools parsing in sv.nf (was the
only workflow missing whitespace trimming)
- Gate PharmCAT behind --tools like all other modules — no longer
runs unconditionally; CPIC requires pharmcat to also be enabled
- Fix ancestry metric: label as "autosomal_snps" when no ref panel
used, "ref_panel_shared_snps" only with actual panel intersection
- Pin Cyrius to 1.1.1 instead of floating pip install
- Document Cyrius network dependency in Known Limitations
* fix: startup contract, messaging, ClinVar gating, CI accuracy
- Add fail-fast validation in main.nf: warn when enabled tools lack
required databases (vep_cache, pcgr_data, expansion_catalog), error
on unpaired clinvar/clinvar_index
- Gate ClinVar behind --tools like all other modules
- Add 'clinvar' to default tools list in nextflow.config and test.config
- Fix README mermaid graph: remove GRIDSS (not in NF pipeline), move
ExpansionHunter from VCF to BAM, fix duphold flow (manta->duphold
not consensus->duphold)
- Update ROADMAP.md staged delivery: replace stale PR 1a/1b/2/3
checklist with single completed PR #17 entry
- Pin nf-core/setup-nextflow to SHA in CI workflow
- Rename JSON validation steps to "syntax" (honest about scope)
- Update test.config comment to document what's covered vs not
- Fix HTML report header: "key results" not "all results", note
BAM-analysis and SV outputs are not included
* fix: fail-fast validation, VEP deps, haplogrep3, module count
- Change database validation from log.warn to error — vep, cpsr,
expansion_hunter now fail at startup without their databases
- Add checkIfExists for reference .fai and .dict sidecars
- Add BAM/BAI paired validation in samplesheet parser
- Enforce VEP dependency: slivar and clinical_filter now error at
startup if vep is not also in --tools
- Remove vep/slivar/clinical_filter/cpsr/expansion_hunter/clinvar
from stub test tools (they now require databases to start)
- Fix schema: add clinvar to default tools, replace "skip gracefully"
with accurate database requirement description
- Fix module count 24 → 27 in docs/nextflow.md and ROADMAP.md
- Replace all stale genepi/haplogrep3 refs with jtb114/haplogrep3
in README, docs, and renovate.json
* fix: EMPTY sentinel collision in HTML_REPORT staging
When multiple report inputs are absent (e.g. clinvar, cpsr, slivar
all disabled), they all resolved to the same EMPTY file, causing
Nextflow staging collisions. Use distinct per-slot sentinel files
(EMPTY_CLINVAR, EMPTY_PHARMCAT, etc.) and check with startsWith
instead of equals.
* fix: python:3.11-slim → python:3.11 for Nextflow metrics, review fixes
- Cyrius and CPIC_LOOKUP containers changed from python:3.11-slim to
python:3.11 (slim lacks procps/ps, causing Nextflow task metrics failure)
- Default --tools reduced to database-free baseline (vep, cpsr, clinvar,
expansion_hunter now opt-in)
- Added cpic+pharmcat fail-fast validation in main.nf
- README: added full database-requiring tools example
- ROADMAP/docs: accurate CI stub coverage claims
- CodeRabbit: disable auto_pause_after_reviewed_commits
* fix: ancestry ID mismatch, HLA file naming, docker.userEmulation
- Ancestry: split VCF→plink conversion and ref panel extraction into
two steps — plink2 applies --extract before --set-all-var-ids, so
DeepVariant '.' IDs never matched the position-based snplist
- HLA: use glob to find t1k-build output files — naming convention
changed between T1K versions (_dna_seq.fa vs prefix_dna_seq.fa)
- Remove deprecated docker.userEmulation from nextflow.config
- Update versions.env python:3.11-slim → python:3.11 (slim lacks
procps/ps required by Nextflow task metrics)
* fix: address CodeRabbit findings and telomerehunter permissions
- telomere_hunter: add containerOptions --user root:root (container
runs as uid=1000 but Nextflow work dirs are root-owned)
- vep: add --af_gnomade for explicit gnomAD exome frequencies
(--everything includes genome but not exome AF)
- main.nf: add .fna to reference extension regex for .dict lookup
- pypgx: remove || true from bundle symlink (fail-fast on errors)
- sv.nf: upgrade duphold/annotsv dependency warnings to errors
(match cpic/pharmcat fail-fast pattern)
* fix: global docker --user root:root for non-root containers
VEP (uid=999) and telomerehunter (uid=1000) both fail with
"cannot touch .command.trace: Permission denied" because Nextflow
work dirs are root-owned. Set docker.runOptions globally instead
of per-module containerOptions.
* fix(cyrius): use correct CLI entry point name
Cyrius 1.1.1 registers its console script as 'cyrius', not
'star_caller'. This caused exit 127 (command not found) on every run.
* fix(cpic,haplogrep): fix PharmCAT 3.x JSON parsing and add --tree flag
CPIC_LOOKUP: PharmCAT 3.2.0 uses a flat genes dict {gene_name: data},
not a nested {source: {gene_name: data}} structure. Removed extra
iteration level.
MITO_HAPLOGROUP: haplogrep3 requires --tree; use phylotree-fu-rcrs@1.2
(PhyloTree 17 Forensic Update, latest available).
* fix(hla,pypgx): use pre-downloaded HLA database, fix pypgx quoting
HLA_TYPING: t1k-build.pl cannot reach ftp.ebi.ac.uk from Docker
containers. Accept pre-downloaded hla.dat via --hla_dat parameter
instead of downloading at runtime.
PYPGX: escaped double quotes inside Nextflow triple-quoted string
broke bash quoting for python3 -c argument. Split into separate
variable assignment to avoid the issue.
* fix(ancestry): match chr prefix when building ref panel snplist
plink2 --output-chr chrM ensures ref panel variant IDs use chr1:pos
format matching the sample VCF, instead of bare 1:pos which caused
zero intersection.
* ci: sync container-test matrix with versions.env
python:3.11-slim in the matrix did not match python:3.11 in
versions.env and the actual Nextflow modules.
* fix(slivar): use bcftools container with pre-built slivar binary
The slivar biocontainer lacks bcftools which the module heavily uses.
Switch to staphb/bcftools:1.21 and accept slivar as a pre-downloaded
static binary via --slivar_bin parameter.
* fix(multiqc): match output dir name to MultiQC 1.33 actual output
MultiQC 1.33 writes data to multiqc_report_data/ not multiqc_data/.
Nextflow declared the old name, causing task failure despite exit 0.
* fix: sync schema defaults, add fail-fast for hla_dat/slivar_bin, fix multiqc stub
- nextflow_schema.json tools.default now matches nextflow.config DB-light default
- Add hla_dat and slivar_bin to schema and startup validation
- Fix MULTIQC stub to create multiqc_report_data (matching output declaration)
* fix: move hla_typing to opt-in tools (requires --hla_dat)
hla_typing needs a pre-downloaded hla.dat file, so it doesn't belong
in the zero-database default set. Sync config, schema, and test profile.
* fix: align bash/docs with Nextflow, add clinvar/pypgx fail-fast
- Add --tree phylotree-fu-rcrs@1.2 to bash haplogrep3 script and docs
- Add clinvar + clinvar_index and pypgx_bundle to startup validation
- README: add --hla_dat, --slivar_bin, --pypgx_bundle, --ancestry_ref
- docs/nextflow.md: fix vcfanno output dir (publishes to vep/), update
BAM-required tool list
- docs/interpreting-results.md: PharmCAT output path for both paths
* fix: address remaining CodeRabbit review findings
- MultiQC: guard against VCF-only runs with no QC inputs
- slivar: copy binary to workdir for Singularity compatibility
- cpic_lookup: use word-boundary matching for phenotype filtering
- cyrius: remove unused reference input
- docs/nextflow.md: update fail-fast contract language
- mito-haplogroup: align bash/docs mount paths to /genome convention
* fix(slivar): chmod staged binary instead of copying to same path
Nextflow stages slivar_bin into workdir as 'slivar', so cp to ./slivar
fails with 'same file'. Just chmod +x the staged file and add PWD to PATH.1 parent f59f250 commit d12979f
73 files changed
Lines changed: 4933 additions & 47 deletions
File tree
- .github/workflows
- assets
- stub
- conf
- docs
- modules/local
- ancestry
- annotsv
- clinical_filter
- clinvar_screen
- cnvnator
- cpic_lookup
- cpsr
- cyrius
- delly
- duphold
- expansion_hunter
- hla_typing
- html_report
- manta
- mito_haplogroup
- mito_variants
- mosdepth
- multiqc
- pharmcat
- prs
- pypgx
- roh
- slivar
- survivor_merge
- telomere_hunter
- vcfanno
- vep
- scripts
- workflows
Some content is hidden
Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
11 | 11 | | |
12 | 12 | | |
13 | 13 | | |
| 14 | + | |
14 | 15 | | |
15 | 16 | | |
16 | 17 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
39 | 39 | | |
40 | 40 | | |
41 | 41 | | |
42 | | - | |
| 42 | + | |
43 | 43 | | |
44 | 44 | | |
45 | 45 | | |
46 | | - | |
47 | | - | |
| 46 | + | |
48 | 47 | | |
49 | 48 | | |
50 | 49 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
| 81 | + | |
| 82 | + | |
| 83 | + | |
| 84 | + | |
| 85 | + | |
| 86 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
30 | 30 | | |
31 | 31 | | |
32 | 32 | | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
33 | 36 | | |
34 | 37 | | |
35 | 38 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
14 | 14 | | |
15 | 15 | | |
16 | 16 | | |
| 17 | + | |
17 | 18 | | |
18 | 19 | | |
19 | 20 | | |
| |||
79 | 80 | | |
80 | 81 | | |
81 | 82 | | |
82 | | - | |
83 | 83 | | |
84 | 84 | | |
85 | 85 | | |
86 | 86 | | |
87 | 87 | | |
88 | 88 | | |
89 | 89 | | |
90 | | - | |
91 | 90 | | |
| 91 | + | |
| 92 | + | |
92 | 93 | | |
93 | 94 | | |
94 | | - | |
95 | 95 | | |
96 | | - | |
97 | | - | |
98 | 96 | | |
| 97 | + | |
99 | 98 | | |
100 | 99 | | |
101 | 100 | | |
| |||
121 | 120 | | |
122 | 121 | | |
123 | 122 | | |
124 | | - | |
| 123 | + | |
125 | 124 | | |
126 | 125 | | |
127 | 126 | | |
| |||
142 | 141 | | |
143 | 142 | | |
144 | 143 | | |
145 | | - | |
| 144 | + | |
146 | 145 | | |
147 | 146 | | |
148 | 147 | | |
| |||
286 | 285 | | |
287 | 286 | | |
288 | 287 | | |
| 288 | + | |
| 289 | + | |
| 290 | + | |
| 291 | + | |
| 292 | + | |
| 293 | + | |
| 294 | + | |
| 295 | + | |
| 296 | + | |
| 297 | + | |
| 298 | + | |
| 299 | + | |
| 300 | + | |
| 301 | + | |
| 302 | + | |
| 303 | + | |
| 304 | + | |
| 305 | + | |
| 306 | + | |
| 307 | + | |
| 308 | + | |
| 309 | + | |
| 310 | + | |
| 311 | + | |
| 312 | + | |
| 313 | + | |
289 | 314 | | |
290 | 315 | | |
291 | 316 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
44 | 44 | | |
45 | 45 | | |
46 | 46 | | |
47 | | - | |
| 47 | + | |
48 | 48 | | |
49 | | - | |
| 49 | + | |
50 | 50 | | |
51 | | - | |
52 | | - | |
53 | | - | |
54 | | - | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
55 | 80 | | |
56 | 81 | | |
57 | 82 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
Whitespace-only changes.
Whitespace-only changes.
0 commit comments