public ByteProvider getDerivedByteProviderPush(FSRL containerFSRL, FSRL derivedFSRL,
			String derivedName, long sizeHint, DerivedStreamPushProducer pusher, TaskMonitor monitor)
			throws CancelledException, IOException {

		// fileCacheNameIndex is queried and updated in separate steps,
		// which could be a race issue with another thread, but in this
		// case should be okay as the only bad result will be extra
		// work being performed recreating the contents of the same derived file a second
		// time.
		assertFullyQualifiedFSRL(containerFSRL);
		String containerMD5 = containerFSRL.getMD5();
		String derivedMD5 = fileCacheNameIndex.get(containerMD5, derivedName);
		FileCacheEntry derivedFile = fileCache.getFileCacheEntry(derivedMD5);
		if (derivedFile == null) {
			monitor.setMessage("Caching " + containerFSRL.getName() + " " + derivedName);
			if (sizeHint > 0) {
				monitor.initialize(sizeHint);
			}
			try (FileCacheEntryBuilder fceBuilder = fileCache.createCacheEntryBuilder(sizeHint)) {
				pusher.push(fceBuilder);
				derivedFile = fceBuilder.finish();
			}
			fileCacheNameIndex.add(containerMD5, derivedName, derivedFile.getMD5());
		}
		derivedFSRL = (derivedFSRL != null)
				? derivedFSRL.withMD5(derivedFile.getMD5())
				: createCachedFileFSRL(derivedFile.getMD5());
		return derivedFile.asByteProvider(derivedFSRL);
	}
Returns a {@link ByteProvider} that contains the
derived (ie. decompressed or decrypted) contents of the requested file.
<p>
The resulting ByteProvider will be a cached file, either written to a 
temporary file, or a in-memory buffer if small enough (see {@link FileCache#MAX_INMEM_FILESIZE}).
<p> 
If the file was not present in the cache, the {@link DerivedStreamPushProducer pusher}
will be called and it will be responsible for producing and writing the derived
file's bytes to a {@link OutputStream}, which will be added to the file cache for next time.

@param containerFSRL {@link FSRL} w/hash of the source (or container) file that this 
derived file is based on
@param derivedFSRL (optional) {@link FSRL} to assign to the resulting ByteProvider
@param derivedName a unique string identifying the derived file inside the source (or container) file
@param sizeHint the expected size of the resulting ByteProvider, or -1 if unknown
@param pusher writes bytes to the supplied OutputStream.  See {@link DerivedStreamPushProducer}
@param monitor {@link TaskMonitor} that will be monitor for cancel requests and updated
with file io progress
@return a {@link ByteProvider} containing the bytes of the requested file, that has the 
specified derivedFSRL, or a pseudo FSRL if not specified.  Never null
@throws CancelledException if the user cancels
@throws IOException if there was an io error
Ghidra/Features/Base/src/main/java/ghidra/formats/gfilesystem/FileSystemService.java