public void autoMerge(TaskMonitor monitor) throws CancelledException {
		monitor.setMessage("Auto-merging External Program Names and determining conflicts.");
		if (monitor.isCancelled()) {
			throw new CancelledException();
		}

		if (mergeManager != null) {
			latestResolvedSymbols = (LongLongHashtable) mergeManager
					.getResolveInformation(MergeConstants.RESOLVED_LATEST_SYMBOLS);
			myResolvedSymbols = (LongLongHashtable) mergeManager
					.getResolveInformation(MergeConstants.RESOLVED_MY_SYMBOLS);
			originalResolvedSymbols = (LongLongHashtable) mergeManager
					.getResolveInformation(MergeConstants.RESOLVED_ORIGINAL_SYMBOLS);

			// Populate the reverse maps.
			mapResultsToOriginalLibs();
			mapResultsToLatestLibs();
			mapResultsToMyLibs();
		}

		// Determine the symbol ID group for each external program (Library) to possibly merge.
		List<IDGroup> idGroups = new ArrayList<>();
		idGroups.addAll(getGroupsForOriginalLibs());
		idGroups.addAll(getGroupsForLatestNewLibs());
		idGroups.addAll(getGroupsForMyNewLibs());

		// Process each Library symbol ID group and determine any conflicts.
		int resolveCount = 0;
		int maximum = idGroups.size();
		monitor.initialize(maximum);
		for (IDGroup idGroup : idGroups) {
			int progress = (int) (((float) (resolveCount / maximum)) * 100);
			autoMergeNamedExternalProgram(idGroup, progress);
			monitor.setProgress(++resolveCount);
		}
	}
This is a generic method for displaying the contents of the information
buffer to the user.
Ghidra/Features/Base/src/main/java/ghidra/app/merge/listing/ExternalProgramMerger.java