Version 0.1: Initial Release

Version 0.11: Fix: SE parameter passing

Version 0.14: Feature: Implement support for PHRED33 quality score encoding (-phred33 or -phred64)

Version 0.15: Feature: Support for logging the trimming (-trimlog <logfile>)

Version 0.17: Feature: Support for HEADCROP task (HEADCROP:<BasesToRemove>)

Version 0.20: Multithreading support
              Summary trim statistics
              Fix: Incorrect alignment score in ILLUMINACLIP
              
Version 0.22: Feature: Support ZIP and BZIP2 format
              Feature: Basic support for short adapters in simple mode in ILLUMINACLIP
             
Version 0.24: Fix: Handle concatenated gzip files

Version 0.25: Feature: Support for -jar invocation. The ‘old’ method, using the explicit class, continues to work
              Fix: Ensure input files are read only once, to allow streaming via shell
              Fix: Report failures correctly in multi-threaded mode

Version 0.27: Feature: Add support for ‘keep reverse’ and ‘minimum adapter length’ to palindrome mode in ILLUMINACLIP
              Feature: Support for short adapters and/or short overlaps
              Feature: Add MAXINFO trimmer
              Performance: Improve FastQ parser and serializer

Version 0.30: Feature: Add AVGQUAL trimmer
              Fix: Correct ‘half-window’ clipping from end of reads in SLIDINGWINDOW (bug introduced in 0.27)
              Performance: Various improvements to simple alignment in ILLUMINACLIP
              Internal: Clean up & refactor ILLUMINACLIP implementation

Version 0.32: Feature: Automatic detection of PHRED encoding
              Feature: Automatic setting of threads based on cpu cores (up to 16)
	      Feature: Support for template-based input and output file names
              Fix: Add missing MANIFEST.MF file

Version 0.33: Fix: Tolerate wider range of QUAL values in automatic PHRED detection

Version 0.35: Feature: Only use automatic thread setting with <=8 cores, up to a maximum of 4 threads
	      Feature: Add read pairing validator
              Feature: Improved parameter handling and problem detection
              Feature: Added 'quiet' mode for log messages
	      Fix: Better error handling in parser
              Fix: Tolerate different length input files in paired mode
              Performance: Improve trimming using different sensitivity based on adapter length

Version 0.36: Feature: More flexible HEADCROP trimmer options
              Feature: TAILCROP trimmer
              Feature: Show version
              Fix: Concatenated gzip files

Version 0.38: Feature: Stats summary file
              Feature: BASECOUNT trimmer

Version 0.39: Feature: More flexible HEADCROP/TAILCROP trimmer options

Version 0.40: Feature: Parallel GZIP/BZIP2 compression
              Feature: Added Maven package management
              Feature: Added modern CI routines
              Feature: Added first JUnit tests
              Feature: Moved to Java 8

Version 0.41: Fix: Bug in IlluminaClippingTrimmer calculateMaximumRange
              Feature: Added extensive JUnit tests
              Performance: Major optimizations in BarcodeSplitter (array-based lookups, loop unswitching, char[] comparison) and fix for short reads
              Performance: Optimized Bzip2 compression (buffer pre-allocation) and CompressionFormat detection
              Feature: Moved to Java 25
              Feature: Replaced Jbzip2 with Apache Commons Compress (concatenated streams)
              Feature: Updated dependencies (Mockito, ByteBuddy, JUnit)
              Feature: Added verbose adapter reporting (-verbose flag)
              Feature: Simplified invocation mode with automatic output filenames and default trimming steps
              Performance: Parallel open of paired-end input files using virtual threads
              Performance: FastqRecord quality integer array cached on first access, eliminating repeated allocation per trimmer
              Performance: FastqRecord trim copy constructor stores a view (offset+length) instead of calling substring(), deferring string materialisation to serialisation time
              Performance: FastqSerializer.writeRecord() writes directly to BufferedWriter, removing per-record StringBuilder allocation
              Performance: ThreadedPipeline task queue widened (threads*2 -> threads*8); sleep(100) busy-wait replaced by blocking RejectedExecutionHandler
              Performance: SerializedBlockQueue compression and output queues widened (buffers -> buffers*2)
              Performance: UncompressedBlockData pre-sizes ByteArrayOutputStream from record lengths and exposes internal buffer to avoid the toByteArray() copy
              Performance: IlluminaClippingTrimmer pre-computes packSeqExternal once per read before adapter loops; packPrefixAndSeq() helper eliminates string concatenation in palindrome matching
              Internal: GzipBlockData, Bzip2BlockData, TrimLogRecord converted to records; BlockData sealed interface
              Internal: SerializedBlock manual Future<BlockData> replaced with CompletableFuture, removing synchronized/wait/notifyAll
              Internal: Switch statements converted to switch expressions throughout (CompressionFormat, FastaRecord, IlluminaClippingTrimmer)
              Fix: ILLUMINACLIP adapter lookup now also searches adapters/ subdirectory in the current working directory, fixing simplified invocation when the JAR is not co-located with the adapters/ folder
