private boolean applyDuplicateFunctionMatches(VTMatchSet matchSet, TaskMonitor monitor)
			throws CancelledException {

		Collection<VTMatch> matches = matchSet.getMatches();

		// If this value gets set to true later it indicates markup errors upon applying markup.
		boolean someMatchesHaveMarkupErrors = false;
		Set<VTAssociation> processedSrcDestPairs = new HashSet<>();

		String message = "Processing match %d of %d...";
		int n = matches.size();
		Iterator<VTMatch> it = matches.iterator();
		for (int i = 0; it.hasNext(); i++) {
			monitor.checkCancelled();
			monitor.setMessage(String.format(message, i, n));

			VTMatch match = it.next();

			VTAssociation association = match.getAssociation();

			// skip if match has already been processed (ie matched or determined to be unable 
			// to match)
			if (processedSrcDestPairs.contains(association)) {
				continue;
			}

			// if this association src/dest pair is already matched or blocked skip it
			if (association.getStatus() != VTAssociationStatus.AVAILABLE) {
				processedSrcDestPairs.add(association);
				continue;
			}

			// get the entire set of functions with the same instructions as the given source and 
			// destination pair
			Set<VTAssociation> allRelatedAssociations = getAllRelatedAssociations(
				match.getSourceAddress(), match.getDestinationAddress(), monitor);

			// Try to find all the unique matches in this set with the same operands as each other.
			// The duplicate function instruction correlator already grouped them into sets of
			// functions pairs with exactly the same instructions. This is trying to find the 
			// correct matches in this set.
			Collection<VTAssociation> uniqueAssociations =
				findUniqueAssociations(allRelatedAssociations, monitor);

			// Whether or not a unique association has been found, add these associations to the 
			// processed list so the check is not repeated for another src/dest pair in this
			// set later.
			processedSrcDestPairs.addAll(allRelatedAssociations);
			if (uniqueAssociations == null) {
				continue;
			}

			// For each good match found, accept the match and apply markup
			for (VTAssociation uniqueAssociation : uniqueAssociations) {
				monitor.checkCancelled();

				VTMatch theMatch =
					getAssociationMatchFromMatchSet(uniqueAssociation, matchSet, monitor);
				if (theMatch == null) {
					Msg.error(this,
						uniqueAssociation.toString() + " Should be in the original match set used");
					continue;
				}

				someMatchesHaveMarkupErrors |= tryToAcceptMatchAndApplyMarkup(theMatch, monitor);
			}
		}

		return someMatchesHaveMarkupErrors;

	}
Method to accept matches and apply markup for duplicate function instruction matches with 
matching operands if they are a unique match within their associated subset. To explain in 
more depth, the duplicate function instruction correlator returns a set of function matches 
such that there are subsets of matches where each function pair has the same exact function 
instructions but possibly different operands. Also, there must be more than one possible
function pair association or it would have been identified as a unique match by the exact 
unique function instruction correltor. This method attempts to find unique matches from 
within the related subsets by comparing operand information. 
@param matches The set of matches from the duplicate function instruction correlator
@param monitor Allows user to cancel
@return true if there are any markup errors, false if no markup errors
@throws CancelledException if cancelled
Ghidra/Features/VersionTracking/src/main/java/ghidra/feature/vt/gui/actions/AutoVersionTrackingTask.java