code: func (rsync *RSync) Patch() (err error) {
  	numMatchers := int64(DefaultConcurrency)
  	blockSize := rsync.Summary.GetBlockSize()
  	sectionSize := rsync.Summary.GetFileSize() / numMatchers
  	sectionSize += int64(blockSize) - (sectionSize % int64(blockSize))
  
  	merger := &comparer.MatchMerger{}
  
  	for i := int64(0); i < numMatchers; i++ {
  		compare := &comparer.Comparer{}
  		offset := sectionSize * i
  
  		sectionReader := bufio.NewReaderSize(
  			io.NewSectionReader(rsync.Input, offset, sectionSize+int64(blockSize)),
  			megabyte, // 1 MB buffer
  		)
  
  		// Bakes in the assumption about how to generate checksums (extract)
  		sectionGenerator := filechecksum.NewFileChecksumGenerator(
  			uint(blockSize),
  		)
  
  		matchStream := compare.StartFindMatchingBlocks(
  			sectionReader, offset, sectionGenerator, rsync.Summary,
  		)
  
  		merger.StartMergeResultStream(matchStream, int64(blockSize))
  	}
  
  	mergedBlocks := merger.GetMergedBlocks()
  	missing := mergedBlocks.GetMissingBlocks(rsync.Summary.GetBlockCount() - 1)
  
  	return sequential.SequentialPatcher(
  		rsync.Input,
  		rsync.Source,
  		toPatcherMissingSpan(missing, int64(blockSize)),
  		toPatcherFoundSpan(mergedBlocks, int64(blockSize)),
  		20*megabyte,
  		rsync.Output,
  	)
  }
docs: // Patch the files