private String getConfigString() {
		ByteArrayOutputStream baos = new ByteArrayOutputStream();

		baos.write(makeByteSelected(this.goLowerCaseNamesCheckBox,
				this.goNationalDexCheckBox, this.goRemoveTradeEvosCheckBox,
				this.goUpdateMovesCheckBox, this.goUpdateMovesLegacyCheckBox,
				this.goUpdateTypesCheckBox, this.tnRandomizeCB,
				this.tcnRandomizeCB));

		baos.write(makeByteSelected(this.pbsChangesRandomEvosRB,
				this.pbsChangesRandomTotalRB, this.pbsChangesShuffleRB,
				this.pbsChangesUnchangedRB, this.paUnchangedRB,
				this.paRandomizeRB, this.paWonderGuardCB,
				this.pbsStandardEXPCurvesCB));

		baos.write(makeByteSelected(this.ptRandomFollowEvosRB,
				this.ptRandomTotalRB, this.ptUnchangedRB, this.codeTweaksCB,
				this.raceModeCB, this.randomizeHollowsCB, this.brokenMovesCB,
				this.pokeLimitCB));

		baos.write(makeByteSelected(this.spCustomRB, this.spRandomRB,
				this.spUnchangedRB, this.spRandom2EvosRB, this.spHeldItemsCB));

		// @4
		writePokemonIndex(baos, this.spCustomPoke1Chooser);
		writePokemonIndex(baos, this.spCustomPoke2Chooser);
		writePokemonIndex(baos, this.spCustomPoke3Chooser);

		// 10
		baos.write(makeByteSelected(this.pmsRandomTotalRB,
				this.pmsRandomTypeRB, this.pmsUnchangedRB,
				this.pmsMetronomeOnlyRB, this.pmsGen14MovesCB));

		// changed 160
		baos.write(makeByteSelected(this.tpPowerLevelsCB, this.tpRandomRB,
				this.tpRivalCarriesStarterCB, this.tpTypeThemedRB,
				this.tpTypeWeightingCB, this.tpUnchangedRB,
				this.tpNoLegendariesCB, this.tpNoEarlyShedinjaCB));

		baos.write(makeByteSelected(this.wpARCatchEmAllRB, this.wpArea11RB,
				this.wpARNoneRB, this.wpARTypeThemedRB, this.wpGlobalRB,
				this.wpRandomRB, this.wpUnchangedRB, this.wpUseTimeCB));

		// bugfix 161
		baos.write(makeByteSelected(this.wpCatchRateCB, this.wpNoLegendariesCB,
				this.wpARSimilarStrengthRB, this.wpHeldItemsCB));

		baos.write(makeByteSelected(this.stpUnchangedRB, this.stpRandomL4LRB,
				this.stpRandomTotalRB));

		baos.write(makeByteSelected(this.thcRandomTotalRB,
				this.thcRandomTypeRB, this.thcUnchangedRB, this.tmmRandomRB,
				this.tmmUnchangedRB));

		baos.write(makeByteSelected(this.mtcRandomTotalRB,
				this.mtcRandomTypeRB, this.mtcUnchangedRB, this.mtmRandomRB,
				this.mtmUnchangedRB));

		// new 150
		baos.write(makeByteSelected(this.igtBothRB, this.igtGivenOnlyRB,
				this.igtRandomItemCB, this.igtRandomIVsCB,
				this.igtRandomNicknameCB, this.igtRandomOTCB,
				this.igtUnchangedRB));

		baos.write(makeByteSelected(this.fiRandomRB, this.fiShuffleRB,
				this.fiUnchangedRB));

		// @ 19
		try {
			if (currentRestrictions != null) {
				writeFullInt(baos, currentRestrictions.toInt());
			} else {
				writeFullInt(baos, 0);
			}
		} catch (IOException e) {
		}

		// @ 23
		try {
			writeFullInt(baos, currentCodeTweaks);
		} catch (IOException e) {

		}

		try {
			byte[] romName = romHandler.getROMName().getBytes("US-ASCII");
			baos.write(romName.length);
			baos.write(romName);
		} catch (UnsupportedEncodingException e) {
			baos.write(0);
		} catch (IOException e) {
			baos.write(0);
		}

		byte[] current = baos.toByteArray();
		CRC32 checksum = new CRC32();
		checksum.update(current);

		try {
			writeFullInt(baos, (int) checksum.getValue());
			writeFullInt(baos, getFileChecksum("trainerclasses.txt"));
			writeFullInt(baos, getFileChecksum("trainernames.txt"));
			writeFullInt(baos, getFileChecksum("nicknames.txt"));
		} catch (IOException e) {
		}

		return DatatypeConverter.printBase64Binary(baos.toByteArray());
	}