public List<SymbolFileLocation> find(SymbolFileInfo symbolFileInfo,
			Set<FindOption> findOptions, TaskMonitor monitor) throws CancelledException {

		if (StringUtils.isBlank(symbolFileInfo.getName())) {
			Msg.warn(this,
				logPrefix() + ": Unable to search for empty filename: " + symbolFileInfo);
			return List.of();
		}

		List<SymbolFileLocation> allFindResults = new ArrayList<>();
		Set<String> uniqueSymbolFilePaths = new HashSet<>();

		for_each_symbol_server_loop: for (SymbolServer symbolServer : symbolServers) {
			monitor.checkCancelled();
			if (!symbolServer.isTrusted() && !findOptions.contains(FindOption.ALLOW_UNTRUSTED)) {
				Msg.debug(this,
					logPrefix() + ": skipping untrusted symbol server " +
						symbolServer.getDescriptiveName());
				continue;
			}

			Msg.debug(this, logPrefix() + ": querying " + symbolServer.getDescriptiveName() +
				" for " + symbolFileInfo.getDescription());

			List<SymbolFileLocation> symbolServerFindResults =
				symbolServer.find(symbolFileInfo, findOptions, monitor);

			Msg.debug(this,
				logPrefix() + ": got " + symbolServerFindResults.size() + " results from " +
					symbolServer.getDescriptiveName());

			// only add unique file locations
			for (SymbolFileLocation symbolFileLocation : symbolServerFindResults) {
				if (uniqueSymbolFilePaths.add(symbolFileLocation.getLocationStr())) {
					allFindResults.add(symbolFileLocation);
					if (findOptions.contains(FindOption.ONLY_FIRST_RESULT)) {
						break for_each_symbol_server_loop;
					}
				}
			}
		}

		Msg.debug(this, logPrefix() + ": found " + allFindResults.size() + " matches");

		return allFindResults;

	}
Searches all {@link SymbolServer symbol servers} for a matching pdb symbol file.
<p>
Returns a list of matches.
<p>
Use {@link SymbolFileLocation#isExactMatch(SymbolFileInfo)} to test elements in the
result list for exactness.

@param symbolFileInfo Pdb file info to search for
@param findOptions set of {@link FindOption} to control the search.
 See {@link FindOption#NO_OPTIONS} or 
 {@link FindOption#of(FindOption...) FindOptions.of(option1, option2...)}
@param monitor {@link TaskMonitor}
@return list of {@link SymbolFileLocation}s
@throws CancelledException if operation canceled by user
Ghidra/Features/PDB/src/main/java/pdb/symbolserver/SymbolServerService.java