private void autoMerge() throws IOException {

		//
		// Get the tag managers for each of the program versions.
		//
		FunctionManagerDB myFunctionManagerDB = (FunctionManagerDB) myProgram.getFunctionManager();
		FunctionTagManagerDB tagManagerMY =
			(FunctionTagManagerDB) myFunctionManagerDB.getFunctionTagManager();

		FunctionManagerDB latestFunctionManagerDB =
			(FunctionManagerDB) latestProgram.getFunctionManager();
		FunctionTagManagerDB tagManagerLATEST =
			(FunctionTagManagerDB) latestFunctionManagerDB.getFunctionTagManager();

		FunctionManagerDB resultFunctionManagerDB =
			(FunctionManagerDB) resultProgram.getFunctionManager();
		FunctionTagManagerDB tagManagerRESULT =
			(FunctionTagManagerDB) resultFunctionManagerDB.getFunctionTagManager();

		FunctionManagerDB originalFunctionManagerDB =
			(FunctionManagerDB) originalProgram.getFunctionManager();
		FunctionTagManagerDB tagManagerORIGINAL =
			(FunctionTagManagerDB) originalFunctionManagerDB.getFunctionTagManager();

		// Get the IDs for all changes (adds/edits/deletes) we have to process.  Note that
		// the 'change' lists contain BOTH edits and deletes; so we have to separate them
		// into their own lists below.
		long[] myAdditionIDs = myChanges.getTagCreations();
		long[] myChangeIDs = myChanges.getTagChanges();
		long[] latestAdditionIDs = latestChanges.getTagCreations();
		long[] latestChangeIDs = latestChanges.getTagChanges();

		List<Long> myEditedIDs = getEdits(myChangeIDs, tagManagerMY, tagManagerORIGINAL);
		List<Long> latestEditedIDs =
			getEdits(latestChangeIDs, tagManagerLATEST, tagManagerORIGINAL);
		List<Long> myDeletedIDs = getDeletes(myChangeIDs, tagManagerMY, tagManagerORIGINAL);
		List<Long> latestDeletedIDs =
			getDeletes(latestChangeIDs, tagManagerLATEST, tagManagerORIGINAL);

		// Now do the actual merging...
		int transactionID = resultProgram.startTransaction(getDescription());

		try {
			mergeAdditions(tagManagerMY, tagManagerLATEST, tagManagerRESULT, myAdditionIDs,
				latestAdditionIDs);

			mergeDeletions(tagManagerRESULT, myEditedIDs, latestEditedIDs, myDeletedIDs,
				latestDeletedIDs);

			mergeEdits(tagManagerMY, tagManagerLATEST, tagManagerRESULT, myEditedIDs,
				latestEditedIDs, latestDeletedIDs);
		}
		finally {
			resultProgram.endTransaction(transactionID, true);
		}
	}
Attempts to merge all tag changes between My and Latest. Any conflicts
will be stored in {@link #tagConflicts} for later resolution.

@throws IOException
Ghidra/Features/Base/src/main/java/ghidra/app/merge/listing/FunctionTagMerger.java