static void study1(AbstractPdb pdb, TaskMonitor monitor) throws CancelledException {
		int indexNumber = pdb.getTypeProgramInterface().getTypeIndexMin();
		int indexLimit = pdb.getTypeProgramInterface().getTypeIndexMaxExclusive();

		Set<String> uniqueNames = new HashSet<>();
		List<String> orderedNames = new ArrayList<>();
		List<String> orderedRecords = new ArrayList<>();

		monitor.initialize(indexLimit - indexNumber);
		monitor.setMessage("Study: NAMES_START");
		while (indexNumber < indexLimit) {
			monitor.checkCancelled();
			String name;
			String record;
			AbstractMsType type = pdb.getTypeRecord(RecordNumber.typeRecordNumber(indexNumber));
			if (type instanceof AbstractCompositeMsType || type instanceof AbstractEnumMsType) {
				if (type instanceof AbstractCompositeMsType) {
					AbstractCompositeMsType compType = (AbstractCompositeMsType) type;
					if (compType instanceof AbstractClassMsType) {
						name = "class " + compType.getName();
					}
					else if (compType instanceof AbstractStructureMsType) {
						name = "struct " + compType.getName();
					}
					else if (compType instanceof AbstractUnionMsType) {
						name = "union " + compType.getName();
					}
					else {
						name = "interface " + compType.getName();
					}
					record = compType.toString();
				}
				else { //type instanceof AbstractEnumMsType
					AbstractEnumMsType enumType = (AbstractEnumMsType) type;
					name = "enum " + enumType.getName();
					record = enumType.toString();
				}
				if (!uniqueNames.contains(name)) {
					uniqueNames.add(name);
					orderedNames.add(name);
				}
				orderedRecords.add(record);
			}
			indexNumber++;
			monitor.incrementProgress(1);
		}

		System.out.println("DUMP_START");
		monitor.setMessage("Study: DUMP_START");
		monitor.initialize(orderedNames.size());
		for (String name : orderedNames) {
			for (String record : orderedRecords) {
				monitor.checkCancelled();
				if (record.startsWith(name)) {
					System.out.println(record);
				}
			}
			System.out.println("----------");
			monitor.incrementProgress(1);
		}
		System.out.println("DUMP_END");

	}
Gets a demangles the name and returns the qualified name. Returns null if not mangled
or if error in demangling.
@param mangledString the mangled string to be decoded
@return the qualified name of the demangled string or null if not mangled or error.
Ghidra/Features/PDB/src/main/java/ghidra/app/util/pdb/pdbapplicator/PdbResearch.java