// 
// Decompiled by Procyon v0.6.0
// 

package com.hypixel.hytale.builtin.buildertools.prefabeditor.ui;

import com.hypixel.hytale.codec.builder.BuilderCodec;
import com.hypixel.hytale.server.core.modules.singleplayer.SingleplayerModule;
import com.hypixel.hytale.server.core.asset.AssetModule;
import com.hypixel.hytale.assetstore.AssetPack;
import javax.annotation.Nullable;
import com.hypixel.hytale.server.core.prefab.PrefabStore;
import java.nio.file.DirectoryStream;
import java.io.IOException;
import java.io.File;
import com.hypixel.hytale.server.core.ui.browser.FileListProvider;
import com.hypixel.hytale.common.util.PathUtil;
import java.nio.file.Files;
import java.nio.file.LinkOption;
import com.hypixel.hytale.builtin.buildertools.prefabeditor.PrefabEditSessionManager;
import java.util.concurrent.CompletableFuture;
import com.hypixel.hytale.protocol.packets.interface_.Page;
import com.hypixel.hytale.component.ComponentAccessor;
import com.hypixel.hytale.builtin.buildertools.BuilderToolsPlugin;
import com.hypixel.hytale.server.core.entity.entities.Player;
import java.util.Iterator;
import com.hypixel.hytale.server.core.ui.builder.EventData;
import com.hypixel.hytale.protocol.packets.interface_.CustomUIEventBindingType;
import com.hypixel.hytale.server.core.Message;
import com.hypixel.hytale.builtin.buildertools.prefabeditor.enums.PrefabRowSplitMode;
import com.hypixel.hytale.builtin.buildertools.prefabeditor.enums.PrefabAlignment;
import com.hypixel.hytale.builtin.buildertools.prefabeditor.enums.PrefabStackingAxis;
import com.hypixel.hytale.server.core.asset.type.environment.config.Environment;
import com.hypixel.hytale.builtin.buildertools.prefabeditor.enums.WorldGenType;
import com.hypixel.hytale.builtin.buildertools.prefabeditor.commands.PrefabEditLoadCommand;
import com.hypixel.hytale.builtin.buildertools.prefabeditor.enums.PrefabRootDirectory;
import com.hypixel.hytale.builtin.buildertools.prefabeditor.PrefabEditorCreationSettings;
import com.hypixel.hytale.server.core.ui.LocalizableString;
import com.hypixel.hytale.component.Store;
import com.hypixel.hytale.server.core.ui.builder.UIEventBuilder;
import com.hypixel.hytale.server.core.ui.builder.UICommandBuilder;
import com.hypixel.hytale.server.core.universe.world.storage.EntityStore;
import com.hypixel.hytale.component.Ref;
import java.nio.file.Paths;
import it.unimi.dsi.fastutil.objects.ObjectArrayList;
import com.hypixel.hytale.protocol.packets.interface_.CustomPageLifetime;
import com.hypixel.hytale.server.core.universe.PlayerRef;
import com.hypixel.hytale.builtin.buildertools.prefablist.AssetPrefabFileProvider;
import javax.annotation.Nonnull;
import java.nio.file.Path;
import com.hypixel.hytale.builtin.buildertools.prefabeditor.PrefabLoadingState;
import com.hypixel.hytale.server.core.ui.DropdownEntryInfo;
import java.util.List;
import com.hypixel.hytale.server.core.ui.Value;
import com.hypixel.hytale.logger.HytaleLogger;
import com.hypixel.hytale.server.core.entity.entities.player.pages.InteractiveCustomUIPage;

public class PrefabEditorLoadSettingsPage extends InteractiveCustomUIPage<PageData>
{
    private static final HytaleLogger LOGGER;
    private static final Value<String> BUTTON_HIGHLIGHTED;
    private static final String ASSETS_ROOT_KEY = "Assets";
    private final List<DropdownEntryInfo> savedConfigsDropdown;
    private volatile boolean isLoading;
    private volatile boolean loadingCancelled;
    private volatile boolean isShuttingDown;
    private PrefabLoadingState currentLoadingState;
    private String loadingWorldName;
    private Path browserRoot;
    private Path browserCurrent;
    private String selectedPath;
    @Nonnull
    private String browserSearchQuery;
    private final List<String> selectedItems;
    @Nonnull
    private final AssetPrefabFileProvider assetProvider;
    private boolean inAssetsRoot;
    @Nonnull
    private Path assetsCurrentDir;
    
    public PrefabEditorLoadSettingsPage(@Nonnull final PlayerRef playerRef) {
        super(playerRef, CustomPageLifetime.CanDismissOrCloseThroughInteraction, PageData.CODEC);
        this.savedConfigsDropdown = new ObjectArrayList<DropdownEntryInfo>();
        this.browserSearchQuery = "";
        this.selectedItems = new ObjectArrayList<String>();
        this.assetProvider = new AssetPrefabFileProvider();
        this.inAssetsRoot = false;
        this.assetsCurrentDir = Paths.get("", new String[0]);
    }
    
    @Override
    public void build(@Nonnull final Ref<EntityStore> ref, @Nonnull final UICommandBuilder commandBuilder, @Nonnull final UIEventBuilder eventBuilder, @Nonnull final Store<EntityStore> store) {
        commandBuilder.append("Pages/PrefabEditorSettings.ui");
        this.savedConfigsDropdown.add(new DropdownEntryInfo(LocalizableString.fromMessageId("server.commands.editprefab.ui.savedConfigs.noneSelected"), ""));
        for (final String assetId : PrefabEditorCreationSettings.getAssetMap().getAssetMap().keySet()) {
            this.savedConfigsDropdown.add(new DropdownEntryInfo(LocalizableString.fromString(assetId), assetId));
        }
        commandBuilder.set("#SavedConfigs #Input.Entries", this.savedConfigsDropdown);
        commandBuilder.set("#SavedConfigs #Input.Value", "");
        final ObjectArrayList<DropdownEntryInfo> rootDirectoryDropdown = new ObjectArrayList<DropdownEntryInfo>();
        for (final PrefabRootDirectory value : PrefabRootDirectory.values()) {
            if (value != PrefabRootDirectory.WORLDGEN) {
                rootDirectoryDropdown.add(new DropdownEntryInfo(LocalizableString.fromMessageId(value.getLocalizationString()), value.name()));
            }
        }
        commandBuilder.set("#MainPage #RootDir #Input.Entries", rootDirectoryDropdown);
        commandBuilder.set("#MainPage #RootDir #Input.Value", PrefabEditLoadCommand.DEFAULT_PREFAB_ROOT_DIRECTORY.name());
        final ObjectArrayList<DropdownEntryInfo> worldGenTypeDropdown = new ObjectArrayList<DropdownEntryInfo>();
        for (final WorldGenType value2 : WorldGenType.values()) {
            worldGenTypeDropdown.add(new DropdownEntryInfo(LocalizableString.fromMessageId(value2.getLocalizationString()), value2.name()));
        }
        commandBuilder.set("#MainPage #WorldGenType #Input.Entries", worldGenTypeDropdown);
        commandBuilder.set("#MainPage #WorldGenType #Input.Value", PrefabEditLoadCommand.DEFAULT_WORLD_GEN_TYPE.name());
        final ObjectArrayList<DropdownEntryInfo> environmentDropdown = new ObjectArrayList<DropdownEntryInfo>();
        Environment.getAssetMap().getAssetMap().keySet().stream().sorted().forEach(envId -> environmentDropdown.add(new DropdownEntryInfo(LocalizableString.fromString(envId), envId)));
        commandBuilder.set("#MainPage #Environment #Input.Entries", environmentDropdown);
        commandBuilder.set("#MainPage #Environment #Input.Value", "Env_Zone1_Plains");
        commandBuilder.set("#MainPage #GrassTint #Input.Color", "#5B9E28");
        final ObjectArrayList<DropdownEntryInfo> axisToPasteOnDropdown = new ObjectArrayList<DropdownEntryInfo>();
        for (final PrefabStackingAxis value3 : PrefabStackingAxis.values()) {
            axisToPasteOnDropdown.add(new DropdownEntryInfo(LocalizableString.fromString(value3.name()), value3.name()));
        }
        commandBuilder.set("#MainPage #PasteAxis #Input.Entries", axisToPasteOnDropdown);
        commandBuilder.set("#MainPage #PasteAxis #Input.Value", PrefabEditLoadCommand.DEFAULT_PREFAB_STACKING_AXIS.name());
        final ObjectArrayList<DropdownEntryInfo> alignmentMethodDropdown = new ObjectArrayList<DropdownEntryInfo>();
        for (final PrefabAlignment value4 : PrefabAlignment.values()) {
            alignmentMethodDropdown.add(new DropdownEntryInfo(LocalizableString.fromMessageId(value4.getLocalizationString()), value4.name()));
        }
        commandBuilder.set("#MainPage #AlignmentMethod #Input.Entries", alignmentMethodDropdown);
        commandBuilder.set("#MainPage #AlignmentMethod #Input.Value", PrefabEditLoadCommand.DEFAULT_PREFAB_ALIGNMENT.name());
        final ObjectArrayList<DropdownEntryInfo> rowSplitModeDropdown = new ObjectArrayList<DropdownEntryInfo>();
        for (final PrefabRowSplitMode value5 : PrefabRowSplitMode.values()) {
            rowSplitModeDropdown.add(new DropdownEntryInfo(LocalizableString.fromMessageId(value5.getLocalizationString()), value5.name()));
        }
        commandBuilder.set("#MainPage #RowSplitMode #Input.Entries", rowSplitModeDropdown);
        commandBuilder.set("#MainPage #RowSplitMode #Input.Value", PrefabEditLoadCommand.DEFAULT_ROW_SPLIT_MODE.name());
        commandBuilder.set("#MainPage #DesiredYLevel #Input.Value", 55);
        commandBuilder.set("#MainPage #BlocksBetweenPrefabs #Input.Value", 15);
        commandBuilder.set("#MainPage #NumAirBeforeGround #Input.Value", 0);
        commandBuilder.set("#MainPage #EnableWorldTicking #CheckBox.Value", false);
        commandBuilder.set("#MainPage #Children.Visible", false);
        commandBuilder.set("#LoadingPage.Visible", false);
        commandBuilder.set("#LoadingPage #ProgressBar.Value", 0.0f);
        commandBuilder.set("#LoadingPage #StatusText.TextSpans", Message.translation("server.commands.editprefab.loading.phase.initializing"));
        commandBuilder.set("#LoadingPage #ErrorText.Visible", false);
        eventBuilder.addEventBinding(CustomUIEventBindingType.Activating, "#MainPage #LoadButton", new EventData().append("Action", Action.Load.name()).append("@RootDir", "#MainPage #RootDir #Input.Value").append("@PrefabPaths", "#MainPage #PrefabPaths #Input.Value").append("@Recursive", "#MainPage #Recursive #CheckBox.Value").append("@Children", "#MainPage #Children #CheckBox.Value").append("@Entities", "#MainPage #Entities #CheckBox.Value").append("@EnableWorldTicking", "#MainPage #EnableWorldTicking #CheckBox.Value").append("@DesiredYLevel", "#MainPage #DesiredYLevel #Input.Value").append("@BlocksBetweenPrefabs", "#MainPage #BlocksBetweenPrefabs #Input.Value").append("@WorldGenType", "#MainPage #WorldGenType #Input.Value").append("@Environment", "#MainPage #Environment #Input.Value").append("@GrassTint", "#MainPage #GrassTint #Input.Color").append("@PasteAxis", "#MainPage #PasteAxis #Input.Value").append("@NumAirBeforeGround", "#MainPage #NumAirBeforeGround #Input.Value").append("@AlignmentMethod", "#MainPage #AlignmentMethod #Input.Value").append("@RowSplitMode", "#MainPage #RowSplitMode #Input.Value"));
        eventBuilder.addEventBinding(CustomUIEventBindingType.ValueChanged, "#MainPage #SavedConfigs #Input", new EventData().append("Action", Action.ApplySavedProperties.name()).append("@ConfigName", "#MainPage #SavedConfigs #Input.Value"));
        eventBuilder.addEventBinding(CustomUIEventBindingType.Activating, "#MainPage #CancelButton", new EventData().append("Action", Action.Cancel.name()));
        eventBuilder.addEventBinding(CustomUIEventBindingType.Activating, "#MainPage #SavePropertiesButton", new EventData().append("Action", Action.OpenSavePropertiesDialog.name()));
        eventBuilder.addEventBinding(CustomUIEventBindingType.Activating, "#SaveConfigPage #CancelButton", new EventData().append("Action", Action.CancelSavePropertiesDialog.name()));
        eventBuilder.addEventBinding(CustomUIEventBindingType.ValueChanged, "#SaveConfigPage #SaveName #Input", new EventData().append("Action", Action.SavePropertiesNameChanged.name()).append("@ConfigName", "#SaveConfigPage #SaveName #Input.Value"));
        eventBuilder.addEventBinding(CustomUIEventBindingType.Activating, "#SaveConfigPage #SavePropertiesButton", new EventData().append("Action", Action.SavePropertiesConfig.name()).append("@ConfigName", "#SaveConfigPage #SaveName #Input.Value").append("@RootDir", "#MainPage #RootDir #Input.Value").append("@PrefabPaths", "#MainPage #PrefabPaths #Input.Value").append("@Recursive", "#MainPage #Recursive #CheckBox.Value").append("@Children", "#MainPage #Children #CheckBox.Value").append("@Entities", "#MainPage #Entities #CheckBox.Value").append("@EnableWorldTicking", "#MainPage #EnableWorldTicking #CheckBox.Value").append("@DesiredYLevel", "#MainPage #DesiredYLevel #Input.Value").append("@BlocksBetweenPrefabs", "#MainPage #BlocksBetweenPrefabs #Input.Value").append("@WorldGenType", "#MainPage #WorldGenType #Input.Value").append("@Environment", "#MainPage #Environment #Input.Value").append("@GrassTint", "#MainPage #GrassTint #Input.Color").append("@PasteAxis", "#MainPage #PasteAxis #Input.Value").append("@NumAirBeforeGround", "#MainPage #NumAirBeforeGround #Input.Value").append("@AlignmentMethod", "#MainPage #AlignmentMethod #Input.Value").append("@RowSplitMode", "#MainPage #RowSplitMode #Input.Value"));
        eventBuilder.addEventBinding(CustomUIEventBindingType.Activating, "#LoadingPage #CancelButton", new EventData().append("Action", Action.CancelLoading.name()));
        eventBuilder.addEventBinding(CustomUIEventBindingType.Activating, "#MainPage #PrefabPaths #BrowseButton", new EventData().append("Action", Action.OpenBrowser.name()));
        eventBuilder.addEventBinding(CustomUIEventBindingType.ValueChanged, "#BrowserPage #BrowserContent #RootSelector", new EventData().append("Action", Action.BrowserRootChanged.name()).append("@BrowserRoot", "#BrowserPage #BrowserContent #RootSelector.Value"), false);
        eventBuilder.addEventBinding(CustomUIEventBindingType.ValueChanged, "#BrowserPage #BrowserContent #SearchInput", new EventData().append("Action", Action.BrowserSearch.name()).append("@BrowserSearch", "#BrowserPage #BrowserContent #SearchInput.Value"), false);
        eventBuilder.addEventBinding(CustomUIEventBindingType.Activating, "#BrowserPage #AddToListButton", new EventData().append("Action", Action.AddFolderToList.name()));
        eventBuilder.addEventBinding(CustomUIEventBindingType.Activating, "#BrowserPage #ConfirmButton", new EventData().append("Action", Action.ConfirmBrowser.name()));
        eventBuilder.addEventBinding(CustomUIEventBindingType.Activating, "#BrowserPage #CancelButton", new EventData().append("Action", Action.CancelBrowser.name()));
        commandBuilder.set("#BrowserPage.Visible", false);
        commandBuilder.set("#BrowserPage #SelectedSection #SelectedItems.Value", "");
    }
    
    @Override
    public void handleDataEvent(@Nonnull final Ref<EntityStore> ref, @Nonnull final Store<EntityStore> store, @Nonnull final PageData data) {
        final Player playerComponent = store.getComponent(ref, Player.getComponentType());
        assert playerComponent != null;
        final PlayerRef playerRefComponent = store.getComponent(ref, PlayerRef.getComponentType());
        assert playerRefComponent != null;
        switch (data.uiAction.ordinal()) {
            case 0: {
                if (this.isLoading || this.isShuttingDown) {
                    return;
                }
                this.isLoading = true;
                this.loadingCancelled = false;
                this.currentLoadingState = new PrefabLoadingState();
                this.loadingWorldName = "prefabEditor-" + playerRefComponent.getUsername();
                final UICommandBuilder showLoadingBuilder = new UICommandBuilder();
                showLoadingBuilder.set("#MainPage.Visible", false);
                showLoadingBuilder.set("#SaveConfigPage.Visible", false);
                showLoadingBuilder.set("#LoadingPage.Visible", true);
                showLoadingBuilder.set("#LoadingPage #ProgressBar.Value", 0.0f);
                showLoadingBuilder.set("#LoadingPage #StatusText.TextSpans", Message.translation("server.commands.editprefab.loading.phase.initializing"));
                showLoadingBuilder.set("#LoadingPage #ErrorText.Visible", false);
                showLoadingBuilder.set("#LoadingPage #CancelButton.Visible", true);
                this.sendUpdate(showLoadingBuilder);
                this.playerRef.sendMessage(Message.translation("server.commands.editprefab.loading"));
                final CompletableFuture<Void> result = BuilderToolsPlugin.get().getPrefabEditSessionManager().loadPrefabAndCreateEditSession(ref, playerComponent, data.toCreationSettings(), store, this::onLoadingProgress);
                if (result == null) {
                    this.onLoadingFailed(Message.translation("server.commands.editprefab.error.failedToStart"));
                    return;
                }
                result.whenComplete((unused, throwable) -> {
                    if (this.loadingCancelled) {
                        return;
                    }
                    else {
                        if (throwable != null) {
                            this.onLoadingFailed(Message.raw((throwable.getMessage() != null) ? throwable.getMessage() : "Unknown error"));
                        }
                        else if (this.currentLoadingState != null && this.currentLoadingState.hasErrors()) {
                            this.onLoadingFailed(this.currentLoadingState.getStatusMessage());
                        }
                        else {
                            this.isLoading = false;
                            this.loadingWorldName = null;
                            this.currentLoadingState = null;
                            playerComponent.getPageManager().setPage(ref, store, Page.ContentCreation);
                        }
                        return;
                    }
                });
                break;
            }
            case 1: {
                final UICommandBuilder commandBuilder = new UICommandBuilder();
                commandBuilder.set("#MainPage.Visible", false);
                commandBuilder.set("#SaveConfigPage.Visible", true);
                this.sendUpdate(commandBuilder);
                break;
            }
            case 2: {
                final UICommandBuilder commandBuilder = new UICommandBuilder();
                commandBuilder.set("#MainPage.Visible", true);
                commandBuilder.set("#SaveConfigPage.Visible", false);
                this.sendUpdate(commandBuilder);
                break;
            }
            case 7: {
                final UICommandBuilder builder = new UICommandBuilder();
                builder.set("#SaveConfigPage #Buttons #SavePropertiesButton.Disabled", data.configName.isBlank());
                this.sendUpdate(builder);
                break;
            }
            case 3: {
                PrefabEditorCreationSettings.save(data.configName, data.toCreationSettings()).thenRun(() -> {
                    final UICommandBuilder builder3 = new UICommandBuilder();
                    builder3.set("#MainPage.Visible", true);
                    builder3.set("#SaveConfigPage.Visible", false);
                    builder3.set("#SaveConfigPage #Buttons.Visible", true);
                    builder3.set("#SaveConfigPage #SaveName #Input.Value", "");
                    this.savedConfigsDropdown.add(new DropdownEntryInfo(LocalizableString.fromString(data.configName), data.configName));
                    builder3.set("#SavedConfigs #Input.Entries", this.savedConfigsDropdown);
                    builder3.set("#SavedConfigs #Input.Value", data.configName);
                    this.sendUpdate(builder3);
                    return;
                });
                break;
            }
            case 4: {
                if (data.configName == null || data.configName.isBlank()) {
                    final UICommandBuilder builder = new UICommandBuilder();
                    builder.set("#MainPage #RootDir #Input.Value", PrefabEditLoadCommand.DEFAULT_PREFAB_ROOT_DIRECTORY.name());
                    builder.set("#MainPage #PrefabPaths #Input.Value", "");
                    builder.set("#MainPage #Recursive #CheckBox.Value", false);
                    builder.set("#MainPage #Children #CheckBox.Value", false);
                    builder.set("#MainPage #Entities #CheckBox.Value", false);
                    builder.set("#MainPage #EnableWorldTicking #CheckBox.Value", false);
                    builder.set("#MainPage #DesiredYLevel #Input.Value", 55);
                    builder.set("#MainPage #BlocksBetweenPrefabs #Input.Value", 15);
                    builder.set("#MainPage #WorldGenType #Input.Value", PrefabEditLoadCommand.DEFAULT_WORLD_GEN_TYPE.name());
                    builder.set("#MainPage #Environment #Input.Value", "Env_Zone1_Plains");
                    builder.set("#MainPage #GrassTint #Input.Color", "#5B9E28");
                    builder.set("#MainPage #NumAirBeforeGround #Input.Value", 0);
                    builder.set("#MainPage #PasteAxis #Input.Value", PrefabEditLoadCommand.DEFAULT_PREFAB_STACKING_AXIS.name());
                    builder.set("#MainPage #AlignmentMethod #Input.Value", PrefabEditLoadCommand.DEFAULT_PREFAB_ALIGNMENT.name());
                    builder.set("#MainPage #RowSplitMode #Input.Value", PrefabEditLoadCommand.DEFAULT_ROW_SPLIT_MODE.name());
                    this.sendUpdate(builder);
                    return;
                }
                PrefabEditorCreationSettings.load(data.configName).thenAccept(settings -> {
                    if (settings == null) {
                        return;
                    }
                    else {
                        final UICommandBuilder builder4 = new UICommandBuilder();
                        builder4.set("#MainPage #RootDir #Input.Value", settings.getPrefabRootDirectory().name());
                        builder4.set("#MainPage #PrefabPaths #Input.Value", String.join(",", settings.getUnprocessedPrefabPaths()));
                        builder4.set("#MainPage #Recursive #CheckBox.Value", settings.isRecursive());
                        builder4.set("#MainPage #Children #CheckBox.Value", settings.isLoadChildren());
                        builder4.set("#MainPage #Entities #CheckBox.Value", settings.shouldLoadEntities());
                        builder4.set("#MainPage #EnableWorldTicking #CheckBox.Value", settings.isWorldTickingEnabled());
                        builder4.set("#MainPage #DesiredYLevel #Input.Value", settings.getPasteYLevelGoal());
                        builder4.set("#MainPage #BlocksBetweenPrefabs #Input.Value", settings.getBlocksBetweenEachPrefab());
                        builder4.set("#MainPage #WorldGenType #Input.Value", settings.getWorldGenType().name());
                        builder4.set("#MainPage #Environment #Input.Value", settings.getEnvironment());
                        builder4.set("#MainPage #GrassTint #Input.Color", settings.getGrassTint());
                        builder4.set("#MainPage #NumAirBeforeGround #Input.Value", settings.getBlocksAboveSurface());
                        builder4.set("#MainPage #PasteAxis #Input.Value", settings.getStackingAxis().name());
                        builder4.set("#MainPage #AlignmentMethod #Input.Value", settings.getAlignment().name());
                        builder4.set("#MainPage #RowSplitMode #Input.Value", settings.getRowSplitMode().name());
                        this.sendUpdate(builder4);
                        return;
                    }
                });
                break;
            }
            case 5: {
                playerComponent.getPageManager().setPage(ref, store, Page.None);
                break;
            }
            case 6: {
                if (this.isShuttingDown) {
                    return;
                }
                this.loadingCancelled = true;
                this.isLoading = false;
                this.isShuttingDown = true;
                final UICommandBuilder cancellingBuilder = new UICommandBuilder();
                cancellingBuilder.set("#LoadingPage #CancelButton.Disabled", true);
                cancellingBuilder.set("#LoadingPage #StatusText.TextSpans", Message.translation("server.commands.editprefab.loading.phase.cancelling"));
                cancellingBuilder.set("#LoadingPage #ProgressBar.Value", 0.1f);
                cancellingBuilder.set("#LoadingPage #ErrorText.Visible", false);
                this.sendUpdate(cancellingBuilder);
                final PrefabEditSessionManager sessionManager = BuilderToolsPlugin.get().getPrefabEditSessionManager();
                if (this.loadingWorldName != null) {
                    final String worldNameToClean = this.loadingWorldName;
                    this.loadingWorldName = null;
                    sessionManager.cleanupCancelledSession(this.playerRef.getUuid(), worldNameToClean, this::onShutdownProgress).whenComplete((unused, throwable) -> {
                        this.isShuttingDown = false;
                        this.currentLoadingState = null;
                        final UICommandBuilder builder5 = new UICommandBuilder();
                        builder5.set("#LoadingPage.Visible", false);
                        builder5.set("#LoadingPage #CancelButton.Disabled", false);
                        builder5.set("#MainPage.Visible", true);
                        this.sendUpdate(builder5);
                        if (throwable != null) {
                            this.playerRef.sendMessage(Message.translation("server.commands.editprefab.error.shutdownFailed"));
                        }
                        return;
                    });
                }
                else {
                    this.isShuttingDown = false;
                    this.currentLoadingState = null;
                    final UICommandBuilder builder2 = new UICommandBuilder();
                    builder2.set("#LoadingPage.Visible", false);
                    builder2.set("#MainPage.Visible", true);
                    this.sendUpdate(builder2);
                }
                break;
            }
            case 8: {
                this.inAssetsRoot = true;
                this.assetsCurrentDir = Paths.get("", new String[0]);
                this.browserRoot = Paths.get("Assets", new String[0]);
                this.browserCurrent = Paths.get("", new String[0]);
                this.selectedPath = null;
                this.browserSearchQuery = "";
                this.selectedItems.clear();
                final UICommandBuilder commandBuilder = new UICommandBuilder();
                final UIEventBuilder eventBuilder = new UIEventBuilder();
                commandBuilder.set("#MainPage.Visible", false);
                commandBuilder.set("#BrowserPage.Visible", true);
                final List<DropdownEntryInfo> roots = this.buildBrowserRootEntries();
                commandBuilder.set("#BrowserPage #BrowserContent #RootSelector.Entries", roots);
                commandBuilder.set("#BrowserPage #BrowserContent #RootSelector.Value", "Assets");
                commandBuilder.set("#BrowserPage #BrowserContent #SearchInput.Value", "");
                commandBuilder.set("#BrowserPage #SelectedSection #SelectedItems.Value", "");
                this.buildBrowserList(commandBuilder, eventBuilder);
                this.sendUpdate(commandBuilder, eventBuilder, false);
                break;
            }
            case 9: {
                if (data.browserFile == null) {
                    return;
                }
                final String fileName = data.browserFile;
                if (this.inAssetsRoot) {
                    this.handleAssetsNavigation(fileName);
                }
                else {
                    this.handleRegularNavigation(fileName);
                }
                break;
            }
            case 10: {
                if (data.browserRootStr == null) {
                    return;
                }
                if (!this.isAllowedBrowserRoot(data.browserRootStr)) {
                    return;
                }
                this.inAssetsRoot = "Assets".equals(data.browserRootStr);
                this.assetsCurrentDir = Paths.get("", new String[0]);
                if (this.inAssetsRoot) {
                    this.browserRoot = Paths.get("Assets", new String[0]);
                    this.browserCurrent = Paths.get("", new String[0]);
                }
                else {
                    this.browserRoot = this.findActualRootPath(data.browserRootStr);
                    if (this.browserRoot == null) {
                        this.browserRoot = Path.of(data.browserRootStr, new String[0]);
                    }
                    this.browserCurrent = this.browserRoot.getFileSystem().getPath("", new String[0]);
                }
                this.selectedPath = null;
                this.browserSearchQuery = "";
                this.selectedItems.clear();
                final UICommandBuilder commandBuilder = new UICommandBuilder();
                final UIEventBuilder eventBuilder = new UIEventBuilder();
                commandBuilder.set("#BrowserPage #BrowserContent #SearchInput.Value", "");
                commandBuilder.set("#BrowserPage #SelectedSection #SelectedItems.Value", "");
                final PrefabRootDirectory rootDirValue = this.getRootDirectoryForPath(data.browserRootStr);
                if (rootDirValue != null) {
                    commandBuilder.set("#MainPage #RootDir #Input.Value", rootDirValue.name());
                }
                this.buildBrowserList(commandBuilder, eventBuilder);
                this.sendUpdate(commandBuilder, eventBuilder, false);
                break;
            }
            case 11: {
                this.browserSearchQuery = ((data.browserSearchStr != null) ? data.browserSearchStr.trim().toLowerCase() : "");
                final UICommandBuilder commandBuilder = new UICommandBuilder();
                final UIEventBuilder eventBuilder = new UIEventBuilder();
                this.buildBrowserList(commandBuilder, eventBuilder);
                this.sendUpdate(commandBuilder, eventBuilder, false);
                break;
            }
            case 12: {
                final String pathToAdd = this.getCurrentBrowserPath();
                if (!pathToAdd.isEmpty() && !this.selectedItems.contains(pathToAdd)) {
                    this.selectedItems.add(pathToAdd);
                }
                final UICommandBuilder commandBuilder2 = new UICommandBuilder();
                commandBuilder2.set("#BrowserPage #SelectedSection #SelectedItems.Value", String.join("\n", this.selectedItems));
                this.sendUpdate(commandBuilder2);
                break;
            }
            case 13: {
                String pathsToSet;
                if (!this.selectedItems.isEmpty()) {
                    pathsToSet = String.join(",", this.selectedItems);
                }
                else {
                    pathsToSet = this.getCurrentBrowserPath();
                }
                final UICommandBuilder commandBuilder2 = new UICommandBuilder();
                commandBuilder2.set("#MainPage #PrefabPaths #Input.Value", pathsToSet);
                final PrefabRootDirectory rootDirValue = this.inAssetsRoot ? PrefabRootDirectory.ASSET : this.getRootDirectoryForPath(this.browserRoot.toString());
                if (rootDirValue != null) {
                    commandBuilder2.set("#MainPage #RootDir #Input.Value", rootDirValue.name());
                }
                commandBuilder2.set("#BrowserPage.Visible", false);
                commandBuilder2.set("#MainPage.Visible", true);
                this.sendUpdate(commandBuilder2);
                break;
            }
            case 14: {
                final UICommandBuilder commandBuilder = new UICommandBuilder();
                commandBuilder.set("#BrowserPage.Visible", false);
                commandBuilder.set("#MainPage.Visible", true);
                this.sendUpdate(commandBuilder);
                break;
            }
        }
    }
    
    private void onLoadingProgress(@Nonnull final PrefabLoadingState state) {
        if (this.loadingCancelled) {
            return;
        }
        this.currentLoadingState = state;
        final UICommandBuilder builder = new UICommandBuilder();
        builder.set("#LoadingPage #ProgressBar.Value", state.getProgressPercentage());
        builder.set("#LoadingPage #StatusText.TextSpans", state.getStatusMessage());
        if (state.hasErrors()) {
            builder.set("#LoadingPage #ErrorText.Visible", true);
            builder.set("#LoadingPage #ErrorText.TextSpans", state.getErrors().getLast().toMessage());
            builder.set("#LoadingPage #CancelButton.Visible", true);
        }
        this.sendUpdate(builder);
    }
    
    private void onLoadingFailed(@Nonnull final Message errorMessage) {
        this.isLoading = false;
        final UICommandBuilder builder = new UICommandBuilder();
        builder.set("#LoadingPage #ProgressBar.Value", 0.0f);
        builder.set("#LoadingPage #StatusText.TextSpans", Message.translation("server.commands.editprefab.loading.phase.error"));
        builder.set("#LoadingPage #ErrorText.Visible", true);
        builder.set("#LoadingPage #ErrorText.TextSpans", errorMessage);
        builder.set("#LoadingPage #CancelButton.Visible", true);
        this.sendUpdate(builder);
    }
    
    private void onShutdownProgress(@Nonnull final PrefabLoadingState state) {
        final UICommandBuilder builder = new UICommandBuilder();
        builder.set("#LoadingPage #ProgressBar.Value", state.getProgressPercentage());
        builder.set("#LoadingPage #StatusText.TextSpans", state.getStatusMessage());
        this.sendUpdate(builder);
    }
    
    private void handleAssetsNavigation(@Nonnull final String fileName) {
        if ("..".equals(fileName)) {
            if (!this.assetsCurrentDir.toString().isEmpty()) {
                final Path parent = this.assetsCurrentDir.getParent();
                this.assetsCurrentDir = ((parent != null) ? parent : Paths.get("", new String[0]));
                final UICommandBuilder commandBuilder = new UICommandBuilder();
                final UIEventBuilder eventBuilder = new UIEventBuilder();
                this.buildBrowserList(commandBuilder, eventBuilder);
                this.sendUpdate(commandBuilder, eventBuilder, false);
            }
            return;
        }
        final String currentDirStr = this.assetsCurrentDir.toString().replace('\\', '/');
        final String targetVirtualPath = currentDirStr.isEmpty() ? fileName : (currentDirStr + "/" + fileName);
        final Path resolvedPath = this.assetProvider.resolveVirtualPath(targetVirtualPath);
        if (resolvedPath == null) {
            this.sendUpdate();
            return;
        }
        if (Files.isDirectory(resolvedPath, new LinkOption[0])) {
            this.assetsCurrentDir = Paths.get(targetVirtualPath, new String[0]);
            this.selectedPath = targetVirtualPath;
            final UICommandBuilder commandBuilder2 = new UICommandBuilder();
            final UIEventBuilder eventBuilder2 = new UIEventBuilder();
            this.buildBrowserList(commandBuilder2, eventBuilder2);
            this.sendUpdate(commandBuilder2, eventBuilder2, false);
        }
        else {
            this.selectedPath = targetVirtualPath;
            final UICommandBuilder commandBuilder2 = new UICommandBuilder();
            commandBuilder2.set("#BrowserPage #CurrentPath.Text", "Assets/" + targetVirtualPath);
            this.sendUpdate(commandBuilder2);
        }
    }
    
    private void handleRegularNavigation(@Nonnull final String fileName) {
        final Path file = this.browserRoot.resolve(this.browserCurrent).resolve(fileName);
        if (!file.normalize().startsWith(this.browserRoot.normalize())) {
            this.sendUpdate();
            return;
        }
        if (Files.isDirectory(file, new LinkOption[0])) {
            this.browserCurrent = PathUtil.relativize(this.browserRoot, file);
            final String pathStr = this.browserCurrent.toString().replace('\\', '/');
            this.selectedPath = (pathStr.isEmpty() ? "/" : (pathStr.endsWith("/") ? pathStr : pathStr));
            final UICommandBuilder commandBuilder = new UICommandBuilder();
            final UIEventBuilder eventBuilder = new UIEventBuilder();
            this.buildBrowserList(commandBuilder, eventBuilder);
            this.sendUpdate(commandBuilder, eventBuilder, false);
        }
        else {
            this.selectedPath = PathUtil.relativize(this.browserRoot, file).toString().replace('\\', '/');
            final UICommandBuilder commandBuilder2 = new UICommandBuilder();
            commandBuilder2.set("#BrowserPage #CurrentPath.Text", this.selectedPath);
            this.sendUpdate(commandBuilder2);
        }
    }
    
    @Nonnull
    private String getCurrentBrowserPath() {
        if (this.selectedPath != null) {
            return this.selectedPath;
        }
        if (this.inAssetsRoot) {
            final String currentDirStr = this.assetsCurrentDir.toString().replace('\\', '/');
            return currentDirStr.isEmpty() ? "/" : (currentDirStr.endsWith("/") ? currentDirStr : currentDirStr);
        }
        final String pathStr = this.browserCurrent.toString().replace('\\', '/');
        return pathStr.isEmpty() ? "/" : (pathStr.endsWith("/") ? pathStr : pathStr);
    }
    
    private void buildBrowserList(@Nonnull final UICommandBuilder commandBuilder, @Nonnull final UIEventBuilder eventBuilder) {
        commandBuilder.clear("#BrowserPage #BrowserContent #FileList");
        if (this.inAssetsRoot) {
            this.buildAssetsBrowserList(commandBuilder, eventBuilder);
        }
        else {
            this.buildRegularBrowserList(commandBuilder, eventBuilder);
        }
    }
    
    private void buildAssetsBrowserList(@Nonnull final UICommandBuilder commandBuilder, @Nonnull final UIEventBuilder eventBuilder) {
        final String currentDirStr = this.assetsCurrentDir.toString().replace('\\', '/');
        String displayPath;
        if (currentDirStr.isEmpty()) {
            displayPath = "Assets";
        }
        else {
            final String[] parts = currentDirStr.split("/", 2);
            final String packName = parts[0];
            final String subPath = (parts.length > 1) ? ("/" + parts[1]) : "";
            if ("HytaleAssets".equals(packName)) {
                displayPath = packName + subPath;
            }
            else {
                displayPath = "Mods/" + packName + subPath;
            }
        }
        commandBuilder.set("#BrowserPage #CurrentPath.Text", displayPath);
        final List<FileListProvider.FileEntry> entries = this.assetProvider.getFiles(this.assetsCurrentDir, this.browserSearchQuery);
        int buttonIndex = 0;
        if (!currentDirStr.isEmpty() && this.browserSearchQuery.isEmpty()) {
            commandBuilder.append("#BrowserPage #BrowserContent #FileList", "Pages/BasicTextButton.ui");
            commandBuilder.set("#BrowserPage #BrowserContent #FileList[0].Text", "../");
            eventBuilder.addEventBinding(CustomUIEventBindingType.Activating, "#BrowserPage #BrowserContent #FileList[0]", new EventData().append("Action", Action.BrowserNavigate.name()).append("File", ".."));
            ++buttonIndex;
        }
        for (FileListProvider.FileEntry entry : entries) {
            final String displayText = entry.isDirectory() ? entry.displayName() : entry.displayName();
            commandBuilder.append("#BrowserPage #BrowserContent #FileList", "Pages/BasicTextButton.ui");
            commandBuilder.set("#BrowserPage #BrowserContent #FileList[" + buttonIndex + "].Text", displayText);
            if (!entry.isDirectory()) {
                commandBuilder.set("#BrowserPage #BrowserContent #FileList[" + buttonIndex + "].Style", PrefabEditorLoadSettingsPage.BUTTON_HIGHLIGHTED);
            }
            eventBuilder.addEventBinding(CustomUIEventBindingType.Activating, "#BrowserPage #BrowserContent #FileList[" + buttonIndex, new EventData().append("Action", Action.BrowserNavigate.name()).append("File", entry.name()));
            ++buttonIndex;
        }
    }
    
    private void buildRegularBrowserList(@Nonnull final UICommandBuilder commandBuilder, @Nonnull final UIEventBuilder eventBuilder) {
        final String rootDisplayPath = this.getRootDisplayPath(this.browserRoot);
        final String currentPath = this.browserCurrent.toString().replace('\\', '/');
        final String currentPathDisplay = currentPath.isEmpty() ? rootDisplayPath : (rootDisplayPath + "/" + currentPath);
        commandBuilder.set("#BrowserPage #CurrentPath.Text", currentPathDisplay);
        final List<File> files = new ObjectArrayList<File>();
        final Path path = this.browserRoot.resolve(this.browserCurrent);
        if (Files.isDirectory(path, new LinkOption[0])) {
            try (final DirectoryStream<Path> stream = Files.newDirectoryStream(path)) {
                for (final Path file : stream) {
                    String fileName = file.getFileName().toString();
                    if (fileName.charAt(0) == '/') {
                        fileName = fileName.substring(1);
                    }
                    if ((fileName.endsWith(".prefab.json") || Files.isDirectory(file, new LinkOption[0])) && (this.browserSearchQuery.isEmpty() || fileName.toLowerCase().contains(this.browserSearchQuery))) {
                        files.add(file.toFile());
                    }
                }
            }
            catch (final IOException e) {
                PrefabEditorLoadSettingsPage.LOGGER.atSevere().log("Error reading directory for browser", e);
            }
        }
        files.sort((a, b) -> {
            if (a.isDirectory() == b.isDirectory()) {
                return a.compareTo(b);
            }
            else {
                return a.isDirectory() ? -1 : 1;
            }
        });
        int buttonIndex = 0;
        if (!this.browserCurrent.toString().isEmpty() && this.browserSearchQuery.isEmpty()) {
            commandBuilder.append("#BrowserPage #BrowserContent #FileList", "Pages/BasicTextButton.ui");
            commandBuilder.set("#BrowserPage #BrowserContent #FileList[0].Text", "../");
            eventBuilder.addEventBinding(CustomUIEventBindingType.Activating, "#BrowserPage #BrowserContent #FileList[0]", new EventData().append("Action", Action.BrowserNavigate.name()).append("File", ".."));
            ++buttonIndex;
        }
        for (File file2 : files) {
            final boolean isDirectory = file2.isDirectory();
            final String fileName2 = file2.getName();
            commandBuilder.append("#BrowserPage #BrowserContent #FileList", "Pages/BasicTextButton.ui");
            commandBuilder.set("#BrowserPage #BrowserContent #FileList[" + buttonIndex + "].Text", isDirectory ? fileName2 : fileName2);
            if (!isDirectory) {
                commandBuilder.set("#BrowserPage #BrowserContent #FileList[" + buttonIndex + "].Style", PrefabEditorLoadSettingsPage.BUTTON_HIGHLIGHTED);
            }
            eventBuilder.addEventBinding(CustomUIEventBindingType.Activating, "#BrowserPage #BrowserContent #FileList[" + buttonIndex, new EventData().append("Action", Action.BrowserNavigate.name()).append("File", fileName2));
            ++buttonIndex;
        }
    }
    
    @Nonnull
    private List<DropdownEntryInfo> buildBrowserRootEntries() {
        final List<DropdownEntryInfo> roots = new ObjectArrayList<DropdownEntryInfo>();
        roots.add(new DropdownEntryInfo(LocalizableString.fromString("Assets"), "Assets"));
        roots.add(new DropdownEntryInfo(LocalizableString.fromString("Server"), PrefabStore.get().getServerPrefabsPath().toString()));
        return roots;
    }
    
    @Nullable
    private Path findActualRootPath(@Nonnull final String pathStr) {
        for (final PrefabStore.AssetPackPrefabPath packPath : PrefabStore.get().getAllAssetPrefabPaths()) {
            if (packPath.prefabsPath().toString().equals(pathStr)) {
                return packPath.prefabsPath();
            }
        }
        if (PrefabStore.get().getServerPrefabsPath().toString().equals(pathStr)) {
            return PrefabStore.get().getServerPrefabsPath();
        }
        if (PrefabStore.get().getWorldGenPrefabsPath().toString().equals(pathStr)) {
            return PrefabStore.get().getWorldGenPrefabsPath();
        }
        return null;
    }
    
    @Nullable
    private AssetPack findAssetPackForPath(@Nonnull final String pathStr) {
        final Path path = Path.of(pathStr, new String[0]).toAbsolutePath().normalize();
        for (final AssetPack pack : AssetModule.get().getAssetPacks()) {
            final Path packPrefabsPath = PrefabStore.get().getAssetPrefabsPathForPack(pack).toAbsolutePath().normalize();
            if (path.equals(packPrefabsPath) || path.startsWith(packPrefabsPath)) {
                return pack;
            }
        }
        return null;
    }
    
    @Nullable
    private PrefabRootDirectory getRootDirectoryForPath(@Nonnull final String pathStr) {
        if ("Assets".equals(pathStr)) {
            return PrefabRootDirectory.ASSET;
        }
        if (pathStr.equals(PrefabStore.get().getServerPrefabsPath().toString())) {
            return PrefabRootDirectory.SERVER;
        }
        if (pathStr.equals(PrefabStore.get().getWorldGenPrefabsPath().toString())) {
            return PrefabRootDirectory.WORLDGEN;
        }
        if (this.findAssetPackForPath(pathStr) != null) {
            return PrefabRootDirectory.ASSET;
        }
        return null;
    }
    
    private boolean isAllowedBrowserRoot(@Nonnull final String pathStr) {
        return SingleplayerModule.isOwner(this.playerRef) || this.getRootDirectoryForPath(pathStr) != null;
    }
    
    @Nonnull
    private String getRootDisplayPath(@Nonnull final Path root) {
        final String rootStr = root.toString();
        if (rootStr.equals(PrefabStore.get().getServerPrefabsPath().toString())) {
            return "ServerRoot/" + String.valueOf(root.getFileName());
        }
        if (rootStr.equals(PrefabStore.get().getWorldGenPrefabsPath().toString())) {
            final Path parent = root.getParent();
            if (parent != null && parent.getFileName() != null) {
                return "WorldgenRoot/" + String.valueOf(parent.getFileName()) + "/" + String.valueOf(root.getFileName());
            }
            return "WorldgenRoot/" + String.valueOf(root.getFileName());
        }
        else {
            final AssetPack pack = this.findAssetPackForPath(rootStr);
            if (pack == null) {
                return root.toString();
            }
            final String packPrefix = pack.equals(AssetModule.get().getBaseAssetPack()) ? "HytaleAssets" : ("[" + pack.getName());
            final Path parent2 = root.getParent();
            if (parent2 != null && parent2.getFileName() != null) {
                return packPrefix + "/" + String.valueOf(parent2.getFileName()) + "/" + String.valueOf(root.getFileName());
            }
            return packPrefix + "/" + String.valueOf(root.getFileName());
        }
    }
    
    static {
        LOGGER = HytaleLogger.forEnclosingClass();
        BUTTON_HIGHLIGHTED = Value.ref("Pages/BasicTextButton.ui", "SelectedLabelStyle");
    }
    
    protected static class PageData
    {
        public static final String CONFIG_NAME = "@ConfigName";
        public static final String ROOT_DIR = "@RootDir";
        public static final String PREFAB_PATHS = "@PrefabPaths";
        public static final String RECURSIVE = "@Recursive";
        public static final String CHILDREN = "@Children";
        public static final String ENTITIES = "@Entities";
        public static final String ENABLE_WORLD_TICKING = "@EnableWorldTicking";
        public static final String DESIRED_Y_LEVEL = "@DesiredYLevel";
        public static final String BLOCKS_BETWEEN_PREFABS = "@BlocksBetweenPrefabs";
        public static final String WORLD_GEN_TYPE = "@WorldGenType";
        public static final String ENVIRONMENT = "@Environment";
        public static final String GRASS_TINT = "@GrassTint";
        public static final String NUM_AIR_BEFORE_GROUND = "@NumAirBeforeGround";
        public static final String PASTE_AXIS = "@PasteAxis";
        public static final String ALIGNMENT_METHOD = "@AlignmentMethod";
        public static final String ROW_SPLIT_MODE = "@RowSplitMode";
        public static final String BROWSER_FILE = "File";
        public static final String BROWSER_ROOT = "@BrowserRoot";
        public static final String BROWSER_SEARCH = "@BrowserSearch";
        public static final BuilderCodec<PageData> CODEC;
        public String configName;
        public Action uiAction;
        public PrefabRootDirectory prefabRootDirectory;
        public String unprocessedPrefabPaths;
        public int pasteYLevelGoal;
        public int blocksBetweenEachPrefab;
        public WorldGenType worldGenType;
        public String environment;
        public String grassTint;
        public int blocksAboveSurface;
        public PrefabStackingAxis stackingAxis;
        public PrefabAlignment alignment;
        public PrefabRowSplitMode rowSplitMode;
        public boolean recursive;
        public boolean loadChildren;
        public boolean loadEntities;
        public boolean enableWorldTicking;
        public String browserFile;
        public String browserRootStr;
        public String browserSearchStr;
        
        public PageData() {
            this.prefabRootDirectory = PrefabRootDirectory.ASSET;
            this.unprocessedPrefabPaths = "";
            this.pasteYLevelGoal = 55;
            this.blocksBetweenEachPrefab = 15;
            this.worldGenType = PrefabEditLoadCommand.DEFAULT_WORLD_GEN_TYPE;
            this.environment = "Env_Zone1_Plains";
            this.grassTint = "#5B9E28";
            this.blocksAboveSurface = 0;
            this.stackingAxis = PrefabEditLoadCommand.DEFAULT_PREFAB_STACKING_AXIS;
            this.alignment = PrefabEditLoadCommand.DEFAULT_PREFAB_ALIGNMENT;
            this.rowSplitMode = PrefabEditLoadCommand.DEFAULT_ROW_SPLIT_MODE;
            this.enableWorldTicking = false;
        }
        
        @Nonnull
        public PrefabEditorCreationSettings toCreationSettings() {
            String normalizedGrassTint = this.grassTint;
            if (normalizedGrassTint != null && normalizedGrassTint.length() > 7) {
                normalizedGrassTint = normalizedGrassTint.substring(0, 7);
            }
            return new PrefabEditorCreationSettings(this.prefabRootDirectory, List.of(this.unprocessedPrefabPaths.split(",")), this.pasteYLevelGoal, this.blocksBetweenEachPrefab, this.worldGenType, this.blocksAboveSurface, this.stackingAxis, this.alignment, this.recursive, this.loadChildren, this.loadEntities, this.enableWorldTicking, this.rowSplitMode, this.environment, normalizedGrassTint);
        }
        
        static {
            // 
            // This method could not be decompiled.
            // 
            // Original Bytecode:
            // 
            //     2: invokedynamic   BootstrapMethod #0, get:()Ljava/util/function/Supplier;
            //     7: invokestatic    com/hypixel/hytale/codec/builder/BuilderCodec.builder:(Ljava/lang/Class;Ljava/util/function/Supplier;)Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
            //    10: new             Lcom/hypixel/hytale/codec/KeyedCodec;
            //    13: dup            
            //    14: ldc             "Action"
            //    16: new             Lcom/hypixel/hytale/codec/codecs/EnumCodec;
            //    19: dup            
            //    20: ldc             Lcom/hypixel/hytale/builtin/buildertools/prefabeditor/ui/PrefabEditorLoadSettingsPage$Action;.class
            //    22: getstatic       com/hypixel/hytale/codec/codecs/EnumCodec$EnumStyle.LEGACY:Lcom/hypixel/hytale/codec/codecs/EnumCodec$EnumStyle;
            //    25: invokespecial   com/hypixel/hytale/codec/codecs/EnumCodec.<init>:(Ljava/lang/Class;Lcom/hypixel/hytale/codec/codecs/EnumCodec$EnumStyle;)V
            //    28: invokespecial   com/hypixel/hytale/codec/KeyedCodec.<init>:(Ljava/lang/String;Lcom/hypixel/hytale/codec/Codec;)V
            //    31: invokedynamic   BootstrapMethod #1, accept:()Ljava/util/function/BiConsumer;
            //    36: invokedynamic   BootstrapMethod #2, apply:()Ljava/util/function/Function;
            //    41: invokevirtual   com/hypixel/hytale/codec/builder/BuilderCodec$Builder.append:(Lcom/hypixel/hytale/codec/KeyedCodec;Ljava/util/function/BiConsumer;Ljava/util/function/Function;)Lcom/hypixel/hytale/codec/builder/BuilderField$FieldBuilder;
            //    44: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.add:()Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
            //    47: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
            //    50: new             Lcom/hypixel/hytale/codec/KeyedCodec;
            //    53: dup            
            //    54: ldc             "@ConfigName"
            //    56: getstatic       com/hypixel/hytale/codec/Codec.STRING:Lcom/hypixel/hytale/codec/codecs/simple/StringCodec;
            //    59: invokespecial   com/hypixel/hytale/codec/KeyedCodec.<init>:(Ljava/lang/String;Lcom/hypixel/hytale/codec/Codec;)V
            //    62: invokedynamic   BootstrapMethod #3, accept:()Ljava/util/function/BiConsumer;
            //    67: invokedynamic   BootstrapMethod #4, apply:()Ljava/util/function/Function;
            //    72: invokevirtual   com/hypixel/hytale/codec/builder/BuilderCodec$Builder.append:(Lcom/hypixel/hytale/codec/KeyedCodec;Ljava/util/function/BiConsumer;Ljava/util/function/Function;)Lcom/hypixel/hytale/codec/builder/BuilderField$FieldBuilder;
            //    75: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.add:()Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
            //    78: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
            //    81: new             Lcom/hypixel/hytale/codec/KeyedCodec;
            //    84: dup            
            //    85: ldc             "@RootDir"
            //    87: new             Lcom/hypixel/hytale/codec/codecs/EnumCodec;
            //    90: dup            
            //    91: ldc             Lcom/hypixel/hytale/builtin/buildertools/prefabeditor/enums/PrefabRootDirectory;.class
            //    93: getstatic       com/hypixel/hytale/codec/codecs/EnumCodec$EnumStyle.LEGACY:Lcom/hypixel/hytale/codec/codecs/EnumCodec$EnumStyle;
            //    96: invokespecial   com/hypixel/hytale/codec/codecs/EnumCodec.<init>:(Ljava/lang/Class;Lcom/hypixel/hytale/codec/codecs/EnumCodec$EnumStyle;)V
            //    99: invokespecial   com/hypixel/hytale/codec/KeyedCodec.<init>:(Ljava/lang/String;Lcom/hypixel/hytale/codec/Codec;)V
            //   102: invokedynamic   BootstrapMethod #5, accept:()Ljava/util/function/BiConsumer;
            //   107: invokedynamic   BootstrapMethod #6, apply:()Ljava/util/function/Function;
            //   112: invokevirtual   com/hypixel/hytale/codec/builder/BuilderCodec$Builder.append:(Lcom/hypixel/hytale/codec/KeyedCodec;Ljava/util/function/BiConsumer;Ljava/util/function/Function;)Lcom/hypixel/hytale/codec/builder/BuilderField$FieldBuilder;
            //   115: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.add:()Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
            //   118: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
            //   121: new             Lcom/hypixel/hytale/codec/KeyedCodec;
            //   124: dup            
            //   125: ldc             "@PrefabPaths"
            //   127: getstatic       com/hypixel/hytale/codec/Codec.STRING:Lcom/hypixel/hytale/codec/codecs/simple/StringCodec;
            //   130: invokespecial   com/hypixel/hytale/codec/KeyedCodec.<init>:(Ljava/lang/String;Lcom/hypixel/hytale/codec/Codec;)V
            //   133: invokedynamic   BootstrapMethod #7, accept:()Ljava/util/function/BiConsumer;
            //   138: invokedynamic   BootstrapMethod #8, apply:()Ljava/util/function/Function;
            //   143: invokevirtual   com/hypixel/hytale/codec/builder/BuilderCodec$Builder.append:(Lcom/hypixel/hytale/codec/KeyedCodec;Ljava/util/function/BiConsumer;Ljava/util/function/Function;)Lcom/hypixel/hytale/codec/builder/BuilderField$FieldBuilder;
            //   146: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.add:()Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
            //   149: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
            //   152: new             Lcom/hypixel/hytale/codec/KeyedCodec;
            //   155: dup            
            //   156: ldc             "@DesiredYLevel"
            //   158: getstatic       com/hypixel/hytale/codec/Codec.INTEGER:Lcom/hypixel/hytale/codec/codecs/simple/IntegerCodec;
            //   161: invokespecial   com/hypixel/hytale/codec/KeyedCodec.<init>:(Ljava/lang/String;Lcom/hypixel/hytale/codec/Codec;)V
            //   164: invokedynamic   BootstrapMethod #9, accept:()Ljava/util/function/BiConsumer;
            //   169: invokedynamic   BootstrapMethod #10, apply:()Ljava/util/function/Function;
            //   174: invokevirtual   com/hypixel/hytale/codec/builder/BuilderCodec$Builder.append:(Lcom/hypixel/hytale/codec/KeyedCodec;Ljava/util/function/BiConsumer;Ljava/util/function/Function;)Lcom/hypixel/hytale/codec/builder/BuilderField$FieldBuilder;
            //   177: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.add:()Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
            //   180: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
            //   183: new             Lcom/hypixel/hytale/codec/KeyedCodec;
            //   186: dup            
            //   187: ldc             "@BlocksBetweenPrefabs"
            //   189: getstatic       com/hypixel/hytale/codec/Codec.INTEGER:Lcom/hypixel/hytale/codec/codecs/simple/IntegerCodec;
            //   192: invokespecial   com/hypixel/hytale/codec/KeyedCodec.<init>:(Ljava/lang/String;Lcom/hypixel/hytale/codec/Codec;)V
            //   195: invokedynamic   BootstrapMethod #11, accept:()Ljava/util/function/BiConsumer;
            //   200: invokedynamic   BootstrapMethod #12, apply:()Ljava/util/function/Function;
            //   205: invokevirtual   com/hypixel/hytale/codec/builder/BuilderCodec$Builder.append:(Lcom/hypixel/hytale/codec/KeyedCodec;Ljava/util/function/BiConsumer;Ljava/util/function/Function;)Lcom/hypixel/hytale/codec/builder/BuilderField$FieldBuilder;
            //   208: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.add:()Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
            //   211: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
            //   214: new             Lcom/hypixel/hytale/codec/KeyedCodec;
            //   217: dup            
            //   218: ldc             "@WorldGenType"
            //   220: new             Lcom/hypixel/hytale/codec/codecs/EnumCodec;
            //   223: dup            
            //   224: ldc             Lcom/hypixel/hytale/builtin/buildertools/prefabeditor/enums/WorldGenType;.class
            //   226: getstatic       com/hypixel/hytale/codec/codecs/EnumCodec$EnumStyle.LEGACY:Lcom/hypixel/hytale/codec/codecs/EnumCodec$EnumStyle;
            //   229: invokespecial   com/hypixel/hytale/codec/codecs/EnumCodec.<init>:(Ljava/lang/Class;Lcom/hypixel/hytale/codec/codecs/EnumCodec$EnumStyle;)V
            //   232: invokespecial   com/hypixel/hytale/codec/KeyedCodec.<init>:(Ljava/lang/String;Lcom/hypixel/hytale/codec/Codec;)V
            //   235: invokedynamic   BootstrapMethod #13, accept:()Ljava/util/function/BiConsumer;
            //   240: invokedynamic   BootstrapMethod #14, apply:()Ljava/util/function/Function;
            //   245: invokevirtual   com/hypixel/hytale/codec/builder/BuilderCodec$Builder.append:(Lcom/hypixel/hytale/codec/KeyedCodec;Ljava/util/function/BiConsumer;Ljava/util/function/Function;)Lcom/hypixel/hytale/codec/builder/BuilderField$FieldBuilder;
            //   248: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.add:()Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
            //   251: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
            //   254: new             Lcom/hypixel/hytale/codec/KeyedCodec;
            //   257: dup            
            //   258: ldc             "@Environment"
            //   260: getstatic       com/hypixel/hytale/codec/Codec.STRING:Lcom/hypixel/hytale/codec/codecs/simple/StringCodec;
            //   263: invokespecial   com/hypixel/hytale/codec/KeyedCodec.<init>:(Ljava/lang/String;Lcom/hypixel/hytale/codec/Codec;)V
            //   266: invokedynamic   BootstrapMethod #15, accept:()Ljava/util/function/BiConsumer;
            //   271: invokedynamic   BootstrapMethod #16, apply:()Ljava/util/function/Function;
            //   276: invokevirtual   com/hypixel/hytale/codec/builder/BuilderCodec$Builder.append:(Lcom/hypixel/hytale/codec/KeyedCodec;Ljava/util/function/BiConsumer;Ljava/util/function/Function;)Lcom/hypixel/hytale/codec/builder/BuilderField$FieldBuilder;
            //   279: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.add:()Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
            //   282: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
            //   285: new             Lcom/hypixel/hytale/codec/KeyedCodec;
            //   288: dup            
            //   289: ldc             "@GrassTint"
            //   291: getstatic       com/hypixel/hytale/codec/Codec.STRING:Lcom/hypixel/hytale/codec/codecs/simple/StringCodec;
            //   294: invokespecial   com/hypixel/hytale/codec/KeyedCodec.<init>:(Ljava/lang/String;Lcom/hypixel/hytale/codec/Codec;)V
            //   297: invokedynamic   BootstrapMethod #17, accept:()Ljava/util/function/BiConsumer;
            //   302: invokedynamic   BootstrapMethod #18, apply:()Ljava/util/function/Function;
            //   307: invokevirtual   com/hypixel/hytale/codec/builder/BuilderCodec$Builder.append:(Lcom/hypixel/hytale/codec/KeyedCodec;Ljava/util/function/BiConsumer;Ljava/util/function/Function;)Lcom/hypixel/hytale/codec/builder/BuilderField$FieldBuilder;
            //   310: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.add:()Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
            //   313: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
            //   316: new             Lcom/hypixel/hytale/codec/KeyedCodec;
            //   319: dup            
            //   320: ldc             "@NumAirBeforeGround"
            //   322: getstatic       com/hypixel/hytale/codec/Codec.INTEGER:Lcom/hypixel/hytale/codec/codecs/simple/IntegerCodec;
            //   325: invokespecial   com/hypixel/hytale/codec/KeyedCodec.<init>:(Ljava/lang/String;Lcom/hypixel/hytale/codec/Codec;)V
            //   328: invokedynamic   BootstrapMethod #19, accept:()Ljava/util/function/BiConsumer;
            //   333: invokedynamic   BootstrapMethod #20, apply:()Ljava/util/function/Function;
            //   338: invokevirtual   com/hypixel/hytale/codec/builder/BuilderCodec$Builder.append:(Lcom/hypixel/hytale/codec/KeyedCodec;Ljava/util/function/BiConsumer;Ljava/util/function/Function;)Lcom/hypixel/hytale/codec/builder/BuilderField$FieldBuilder;
            //   341: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.add:()Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
            //   344: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
            //   347: new             Lcom/hypixel/hytale/codec/KeyedCodec;
            //   350: dup            
            //   351: ldc             "@PasteAxis"
            //   353: new             Lcom/hypixel/hytale/codec/codecs/EnumCodec;
            //   356: dup            
            //   357: ldc             Lcom/hypixel/hytale/builtin/buildertools/prefabeditor/enums/PrefabStackingAxis;.class
            //   359: getstatic       com/hypixel/hytale/codec/codecs/EnumCodec$EnumStyle.LEGACY:Lcom/hypixel/hytale/codec/codecs/EnumCodec$EnumStyle;
            //   362: invokespecial   com/hypixel/hytale/codec/codecs/EnumCodec.<init>:(Ljava/lang/Class;Lcom/hypixel/hytale/codec/codecs/EnumCodec$EnumStyle;)V
            //   365: invokespecial   com/hypixel/hytale/codec/KeyedCodec.<init>:(Ljava/lang/String;Lcom/hypixel/hytale/codec/Codec;)V
            //   368: invokedynamic   BootstrapMethod #21, accept:()Ljava/util/function/BiConsumer;
            //   373: invokedynamic   BootstrapMethod #22, apply:()Ljava/util/function/Function;
            //   378: invokevirtual   com/hypixel/hytale/codec/builder/BuilderCodec$Builder.append:(Lcom/hypixel/hytale/codec/KeyedCodec;Ljava/util/function/BiConsumer;Ljava/util/function/Function;)Lcom/hypixel/hytale/codec/builder/BuilderField$FieldBuilder;
            //   381: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.add:()Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
            //   384: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
            //   387: new             Lcom/hypixel/hytale/codec/KeyedCodec;
            //   390: dup            
            //   391: ldc             "@AlignmentMethod"
            //   393: new             Lcom/hypixel/hytale/codec/codecs/EnumCodec;
            //   396: dup            
            //   397: ldc_w           Lcom/hypixel/hytale/builtin/buildertools/prefabeditor/enums/PrefabAlignment;.class
            //   400: getstatic       com/hypixel/hytale/codec/codecs/EnumCodec$EnumStyle.LEGACY:Lcom/hypixel/hytale/codec/codecs/EnumCodec$EnumStyle;
            //   403: invokespecial   com/hypixel/hytale/codec/codecs/EnumCodec.<init>:(Ljava/lang/Class;Lcom/hypixel/hytale/codec/codecs/EnumCodec$EnumStyle;)V
            //   406: invokespecial   com/hypixel/hytale/codec/KeyedCodec.<init>:(Ljava/lang/String;Lcom/hypixel/hytale/codec/Codec;)V
            //   409: invokedynamic   BootstrapMethod #23, accept:()Ljava/util/function/BiConsumer;
            //   414: invokedynamic   BootstrapMethod #24, apply:()Ljava/util/function/Function;
            //   419: invokevirtual   com/hypixel/hytale/codec/builder/BuilderCodec$Builder.append:(Lcom/hypixel/hytale/codec/KeyedCodec;Ljava/util/function/BiConsumer;Ljava/util/function/Function;)Lcom/hypixel/hytale/codec/builder/BuilderField$FieldBuilder;
            //   422: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.add:()Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
            //   425: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
            //   428: new             Lcom/hypixel/hytale/codec/KeyedCodec;
            //   431: dup            
            //   432: ldc_w           "@RowSplitMode"
            //   435: new             Lcom/hypixel/hytale/codec/codecs/EnumCodec;
            //   438: dup            
            //   439: ldc_w           Lcom/hypixel/hytale/builtin/buildertools/prefabeditor/enums/PrefabRowSplitMode;.class
            //   442: getstatic       com/hypixel/hytale/codec/codecs/EnumCodec$EnumStyle.LEGACY:Lcom/hypixel/hytale/codec/codecs/EnumCodec$EnumStyle;
            //   445: invokespecial   com/hypixel/hytale/codec/codecs/EnumCodec.<init>:(Ljava/lang/Class;Lcom/hypixel/hytale/codec/codecs/EnumCodec$EnumStyle;)V
            //   448: invokespecial   com/hypixel/hytale/codec/KeyedCodec.<init>:(Ljava/lang/String;Lcom/hypixel/hytale/codec/Codec;)V
            //   451: invokedynamic   BootstrapMethod #25, accept:()Ljava/util/function/BiConsumer;
            //   456: invokedynamic   BootstrapMethod #26, apply:()Ljava/util/function/Function;
            //   461: invokevirtual   com/hypixel/hytale/codec/builder/BuilderCodec$Builder.append:(Lcom/hypixel/hytale/codec/KeyedCodec;Ljava/util/function/BiConsumer;Ljava/util/function/Function;)Lcom/hypixel/hytale/codec/builder/BuilderField$FieldBuilder;
            //   464: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.add:()Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
            //   467: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
            //   470: new             Lcom/hypixel/hytale/codec/KeyedCodec;
            //   473: dup            
            //   474: ldc_w           "@Recursive"
            //   477: getstatic       com/hypixel/hytale/codec/Codec.BOOLEAN:Lcom/hypixel/hytale/codec/codecs/simple/BooleanCodec;
            //   480: invokespecial   com/hypixel/hytale/codec/KeyedCodec.<init>:(Ljava/lang/String;Lcom/hypixel/hytale/codec/Codec;)V
            //   483: invokedynamic   BootstrapMethod #27, accept:()Ljava/util/function/BiConsumer;
            //   488: invokedynamic   BootstrapMethod #28, apply:()Ljava/util/function/Function;
            //   493: invokevirtual   com/hypixel/hytale/codec/builder/BuilderCodec$Builder.append:(Lcom/hypixel/hytale/codec/KeyedCodec;Ljava/util/function/BiConsumer;Ljava/util/function/Function;)Lcom/hypixel/hytale/codec/builder/BuilderField$FieldBuilder;
            //   496: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.add:()Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
            //   499: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
            //   502: new             Lcom/hypixel/hytale/codec/KeyedCodec;
            //   505: dup            
            //   506: ldc_w           "@Children"
            //   509: getstatic       com/hypixel/hytale/codec/Codec.BOOLEAN:Lcom/hypixel/hytale/codec/codecs/simple/BooleanCodec;
            //   512: invokespecial   com/hypixel/hytale/codec/KeyedCodec.<init>:(Ljava/lang/String;Lcom/hypixel/hytale/codec/Codec;)V
            //   515: invokedynamic   BootstrapMethod #29, accept:()Ljava/util/function/BiConsumer;
            //   520: invokedynamic   BootstrapMethod #30, apply:()Ljava/util/function/Function;
            //   525: invokevirtual   com/hypixel/hytale/codec/builder/BuilderCodec$Builder.append:(Lcom/hypixel/hytale/codec/KeyedCodec;Ljava/util/function/BiConsumer;Ljava/util/function/Function;)Lcom/hypixel/hytale/codec/builder/BuilderField$FieldBuilder;
            //   528: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.add:()Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
            //   531: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
            //   534: new             Lcom/hypixel/hytale/codec/KeyedCodec;
            //   537: dup            
            //   538: ldc_w           "@Entities"
            //   541: getstatic       com/hypixel/hytale/codec/Codec.BOOLEAN:Lcom/hypixel/hytale/codec/codecs/simple/BooleanCodec;
            //   544: invokespecial   com/hypixel/hytale/codec/KeyedCodec.<init>:(Ljava/lang/String;Lcom/hypixel/hytale/codec/Codec;)V
            //   547: invokedynamic   BootstrapMethod #31, accept:()Ljava/util/function/BiConsumer;
            //   552: invokedynamic   BootstrapMethod #32, apply:()Ljava/util/function/Function;
            //   557: invokevirtual   com/hypixel/hytale/codec/builder/BuilderCodec$Builder.append:(Lcom/hypixel/hytale/codec/KeyedCodec;Ljava/util/function/BiConsumer;Ljava/util/function/Function;)Lcom/hypixel/hytale/codec/builder/BuilderField$FieldBuilder;
            //   560: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.add:()Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
            //   563: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
            //   566: new             Lcom/hypixel/hytale/codec/KeyedCodec;
            //   569: dup            
            //   570: ldc_w           "@EnableWorldTicking"
            //   573: getstatic       com/hypixel/hytale/codec/Codec.BOOLEAN:Lcom/hypixel/hytale/codec/codecs/simple/BooleanCodec;
            //   576: invokespecial   com/hypixel/hytale/codec/KeyedCodec.<init>:(Ljava/lang/String;Lcom/hypixel/hytale/codec/Codec;)V
            //   579: invokedynamic   BootstrapMethod #33, accept:()Ljava/util/function/BiConsumer;
            //   584: invokedynamic   BootstrapMethod #34, apply:()Ljava/util/function/Function;
            //   589: invokevirtual   com/hypixel/hytale/codec/builder/BuilderCodec$Builder.append:(Lcom/hypixel/hytale/codec/KeyedCodec;Ljava/util/function/BiConsumer;Ljava/util/function/Function;)Lcom/hypixel/hytale/codec/builder/BuilderField$FieldBuilder;
            //   592: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.add:()Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
            //   595: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
            //   598: new             Lcom/hypixel/hytale/codec/KeyedCodec;
            //   601: dup            
            //   602: ldc_w           "File"
            //   605: getstatic       com/hypixel/hytale/codec/Codec.STRING:Lcom/hypixel/hytale/codec/codecs/simple/StringCodec;
            //   608: invokespecial   com/hypixel/hytale/codec/KeyedCodec.<init>:(Ljava/lang/String;Lcom/hypixel/hytale/codec/Codec;)V
            //   611: invokedynamic   BootstrapMethod #35, accept:()Ljava/util/function/BiConsumer;
            //   616: invokedynamic   BootstrapMethod #36, apply:()Ljava/util/function/Function;
            //   621: invokevirtual   com/hypixel/hytale/codec/builder/BuilderCodec$Builder.append:(Lcom/hypixel/hytale/codec/KeyedCodec;Ljava/util/function/BiConsumer;Ljava/util/function/Function;)Lcom/hypixel/hytale/codec/builder/BuilderField$FieldBuilder;
            //   624: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.add:()Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
            //   627: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
            //   630: new             Lcom/hypixel/hytale/codec/KeyedCodec;
            //   633: dup            
            //   634: ldc_w           "@BrowserRoot"
            //   637: getstatic       com/hypixel/hytale/codec/Codec.STRING:Lcom/hypixel/hytale/codec/codecs/simple/StringCodec;
            //   640: invokespecial   com/hypixel/hytale/codec/KeyedCodec.<init>:(Ljava/lang/String;Lcom/hypixel/hytale/codec/Codec;)V
            //   643: invokedynamic   BootstrapMethod #37, accept:()Ljava/util/function/BiConsumer;
            //   648: invokedynamic   BootstrapMethod #38, apply:()Ljava/util/function/Function;
            //   653: invokevirtual   com/hypixel/hytale/codec/builder/BuilderCodec$Builder.append:(Lcom/hypixel/hytale/codec/KeyedCodec;Ljava/util/function/BiConsumer;Ljava/util/function/Function;)Lcom/hypixel/hytale/codec/builder/BuilderField$FieldBuilder;
            //   656: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.add:()Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
            //   659: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
            //   662: new             Lcom/hypixel/hytale/codec/KeyedCodec;
            //   665: dup            
            //   666: ldc_w           "@BrowserSearch"
            //   669: getstatic       com/hypixel/hytale/codec/Codec.STRING:Lcom/hypixel/hytale/codec/codecs/simple/StringCodec;
            //   672: invokespecial   com/hypixel/hytale/codec/KeyedCodec.<init>:(Ljava/lang/String;Lcom/hypixel/hytale/codec/Codec;)V
            //   675: invokedynamic   BootstrapMethod #39, accept:()Ljava/util/function/BiConsumer;
            //   680: invokedynamic   BootstrapMethod #40, apply:()Ljava/util/function/Function;
            //   685: invokevirtual   com/hypixel/hytale/codec/builder/BuilderCodec$Builder.append:(Lcom/hypixel/hytale/codec/KeyedCodec;Ljava/util/function/BiConsumer;Ljava/util/function/Function;)Lcom/hypixel/hytale/codec/builder/BuilderField$FieldBuilder;
            //   688: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.add:()Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
            //   691: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
            //   694: invokevirtual   com/hypixel/hytale/codec/builder/BuilderCodec$Builder.build:()Lcom/hypixel/hytale/codec/builder/BuilderCodec;
            //   697: putstatic       com/hypixel/hytale/builtin/buildertools/prefabeditor/ui/PrefabEditorLoadSettingsPage$PageData.CODEC:Lcom/hypixel/hytale/codec/builder/BuilderCodec;
            //   700: return         
            // 
            // The error that occurred was:
            // 
            // java.lang.UnsupportedOperationException: The requested operation is not supported.
            //     at com.strobel.util.ContractUtils.unsupported(ContractUtils.java:27)
            //     at com.strobel.assembler.metadata.TypeReference.getRawType(TypeReference.java:284)
            //     at com.strobel.assembler.metadata.TypeReference.getRawType(TypeReference.java:279)
            //     at com.strobel.assembler.metadata.TypeReference.makeGenericType(TypeReference.java:154)
            //     at com.strobel.assembler.metadata.TypeSubstitutionVisitor.visitClassType(TypeSubstitutionVisitor.java:267)
            //     at com.strobel.assembler.metadata.TypeSubstitutionVisitor.visitClassType(TypeSubstitutionVisitor.java:25)
            //     at com.strobel.assembler.metadata.TypeDefinition.accept(TypeDefinition.java:189)
            //     at com.strobel.assembler.metadata.TypeSubstitutionVisitor.visit(TypeSubstitutionVisitor.java:40)
            //     at com.strobel.assembler.metadata.TypeSubstitutionVisitor.visitMethod(TypeSubstitutionVisitor.java:324)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferCall(TypeAnalysis.java:2586)
            //     at com.strobel.decompiler.ast.TypeAnalysis.doInferTypeForExpression(TypeAnalysis.java:1040)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:815)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:790)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferCall(TypeAnalysis.java:2689)
            //     at com.strobel.decompiler.ast.TypeAnalysis.doInferTypeForExpression(TypeAnalysis.java:1040)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:815)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:782)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:778)
            //     at com.strobel.decompiler.ast.TypeAnalysis.doInferTypeForExpression(TypeAnalysis.java:1510)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:815)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:790)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferCall(TypeAnalysis.java:2689)
            //     at com.strobel.decompiler.ast.TypeAnalysis.doInferTypeForExpression(TypeAnalysis.java:1040)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:815)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:790)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferCall(TypeAnalysis.java:2689)
            //     at com.strobel.decompiler.ast.TypeAnalysis.doInferTypeForExpression(TypeAnalysis.java:1040)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:815)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:782)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:778)
            //     at com.strobel.decompiler.ast.TypeAnalysis.doInferTypeForExpression(TypeAnalysis.java:1510)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:815)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:790)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferCall(TypeAnalysis.java:2689)
            //     at com.strobel.decompiler.ast.TypeAnalysis.doInferTypeForExpression(TypeAnalysis.java:1040)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:815)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:790)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferCall(TypeAnalysis.java:2689)
            //     at com.strobel.decompiler.ast.TypeAnalysis.doInferTypeForExpression(TypeAnalysis.java:1040)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:815)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:782)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:778)
            //     at com.strobel.decompiler.ast.TypeAnalysis.doInferTypeForExpression(TypeAnalysis.java:1510)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:815)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:790)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferCall(TypeAnalysis.java:2689)
            //     at com.strobel.decompiler.ast.TypeAnalysis.doInferTypeForExpression(TypeAnalysis.java:1040)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:815)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:790)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferCall(TypeAnalysis.java:2689)
            //     at com.strobel.decompiler.ast.TypeAnalysis.doInferTypeForExpression(TypeAnalysis.java:1040)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:815)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:782)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:778)
            //     at com.strobel.decompiler.ast.TypeAnalysis.doInferTypeForExpression(TypeAnalysis.java:1510)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:815)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:790)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferCall(TypeAnalysis.java:2689)
            //     at com.strobel.decompiler.ast.TypeAnalysis.doInferTypeForExpression(TypeAnalysis.java:1040)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:815)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:790)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferCall(TypeAnalysis.java:2689)
            //     at com.strobel.decompiler.ast.TypeAnalysis.doInferTypeForExpression(TypeAnalysis.java:1040)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:815)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:782)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:778)
            //     at com.strobel.decompiler.ast.TypeAnalysis.doInferTypeForExpression(TypeAnalysis.java:1510)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:815)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:790)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferCall(TypeAnalysis.java:2689)
            //     at com.strobel.decompiler.ast.TypeAnalysis.doInferTypeForExpression(TypeAnalysis.java:1040)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:815)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:782)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:778)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferCall(TypeAnalysis.java:2483)
            //     at com.strobel.decompiler.ast.TypeAnalysis.doInferTypeForExpression(TypeAnalysis.java:1040)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:815)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:782)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:778)
            //     at com.strobel.decompiler.ast.TypeAnalysis.doInferTypeForExpression(TypeAnalysis.java:1510)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:815)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:782)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:778)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferCall(TypeAnalysis.java:2483)
            //     at com.strobel.decompiler.ast.TypeAnalysis.doInferTypeForExpression(TypeAnalysis.java:1040)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:815)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:782)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:778)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferCall(TypeAnalysis.java:2483)
            //     at com.strobel.decompiler.ast.TypeAnalysis.doInferTypeForExpression(TypeAnalysis.java:1040)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:815)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:782)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:778)
            //     at com.strobel.decompiler.ast.TypeAnalysis.doInferTypeForExpression(TypeAnalysis.java:1510)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:815)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:782)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:778)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferCall(TypeAnalysis.java:2483)
            //     at com.strobel.decompiler.ast.TypeAnalysis.doInferTypeForExpression(TypeAnalysis.java:1040)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:815)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:782)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:778)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferCall(TypeAnalysis.java:2483)
            //     at com.strobel.decompiler.ast.TypeAnalysis.doInferTypeForExpression(TypeAnalysis.java:1040)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:815)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:782)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:778)
            //     at com.strobel.decompiler.ast.TypeAnalysis.doInferTypeForExpression(TypeAnalysis.java:1510)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:815)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:782)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:778)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferCall(TypeAnalysis.java:2483)
            //     at com.strobel.decompiler.ast.TypeAnalysis.doInferTypeForExpression(TypeAnalysis.java:1040)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:815)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:782)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:778)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferCall(TypeAnalysis.java:2483)
            //     at com.strobel.decompiler.ast.TypeAnalysis.doInferTypeForExpression(TypeAnalysis.java:1040)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:815)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:782)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:778)
            //     at com.strobel.decompiler.ast.TypeAnalysis.doInferTypeForExpression(TypeAnalysis.java:1510)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:815)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:782)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:778)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferCall(TypeAnalysis.java:2483)
            //     at com.strobel.decompiler.ast.TypeAnalysis.doInferTypeForExpression(TypeAnalysis.java:1040)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:815)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:782)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:778)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferCall(TypeAnalysis.java:2483)
            //     at com.strobel.decompiler.ast.TypeAnalysis.doInferTypeForExpression(TypeAnalysis.java:1040)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:815)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:782)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:778)
            //     at com.strobel.decompiler.ast.TypeAnalysis.doInferTypeForExpression(TypeAnalysis.java:1510)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:815)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:782)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:778)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferCall(TypeAnalysis.java:2483)
            //     at com.strobel.decompiler.ast.TypeAnalysis.doInferTypeForExpression(TypeAnalysis.java:1040)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:815)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:782)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:778)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferCall(TypeAnalysis.java:2483)
            //     at com.strobel.decompiler.ast.TypeAnalysis.doInferTypeForExpression(TypeAnalysis.java:1040)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:815)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:782)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:778)
            //     at com.strobel.decompiler.ast.TypeAnalysis.doInferTypeForExpression(TypeAnalysis.java:1510)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:815)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:782)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:778)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferCall(TypeAnalysis.java:2483)
            //     at com.strobel.decompiler.ast.TypeAnalysis.doInferTypeForExpression(TypeAnalysis.java:1040)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:815)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:782)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:778)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferCall(TypeAnalysis.java:2483)
            //     at com.strobel.decompiler.ast.TypeAnalysis.doInferTypeForExpression(TypeAnalysis.java:1040)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:815)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:782)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:778)
            //     at com.strobel.decompiler.ast.TypeAnalysis.doInferTypeForExpression(TypeAnalysis.java:1510)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:815)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:782)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:778)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferCall(TypeAnalysis.java:2483)
            //     at com.strobel.decompiler.ast.TypeAnalysis.doInferTypeForExpression(TypeAnalysis.java:1040)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:815)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:782)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:778)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferCall(TypeAnalysis.java:2483)
            //     at com.strobel.decompiler.ast.TypeAnalysis.doInferTypeForExpression(TypeAnalysis.java:1040)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:815)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:782)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:778)
            //     at com.strobel.decompiler.ast.TypeAnalysis.doInferTypeForExpression(TypeAnalysis.java:1510)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:815)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:782)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:778)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferCall(TypeAnalysis.java:2483)
            //     at com.strobel.decompiler.ast.TypeAnalysis.doInferTypeForExpression(TypeAnalysis.java:1040)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:815)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:782)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:778)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferCall(TypeAnalysis.java:2483)
            //     at com.strobel.decompiler.ast.TypeAnalysis.doInferTypeForExpression(TypeAnalysis.java:1040)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:815)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:782)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:778)
            //     at com.strobel.decompiler.ast.TypeAnalysis.doInferTypeForExpression(TypeAnalysis.java:1510)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:815)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:782)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:778)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferCall(TypeAnalysis.java:2483)
            //     at com.strobel.decompiler.ast.TypeAnalysis.doInferTypeForExpression(TypeAnalysis.java:1040)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:815)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:782)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:778)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferCall(TypeAnalysis.java:2483)
            //     at com.strobel.decompiler.ast.TypeAnalysis.doInferTypeForExpression(TypeAnalysis.java:1040)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:815)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:782)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:778)
            //     at com.strobel.decompiler.ast.TypeAnalysis.doInferTypeForExpression(TypeAnalysis.java:1510)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:815)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:782)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:778)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferCall(TypeAnalysis.java:2483)
            //     at com.strobel.decompiler.ast.TypeAnalysis.doInferTypeForExpression(TypeAnalysis.java:1040)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:815)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:782)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:778)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferCall(TypeAnalysis.java:2483)
            //     at com.strobel.decompiler.ast.TypeAnalysis.doInferTypeForExpression(TypeAnalysis.java:1040)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:815)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:782)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:778)
            //     at com.strobel.decompiler.ast.TypeAnalysis.doInferTypeForExpression(TypeAnalysis.java:1510)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:815)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:782)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:778)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferCall(TypeAnalysis.java:2483)
            //     at com.strobel.decompiler.ast.TypeAnalysis.doInferTypeForExpression(TypeAnalysis.java:1040)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:815)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:782)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:778)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferCall(TypeAnalysis.java:2483)
            //     at com.strobel.decompiler.ast.TypeAnalysis.doInferTypeForExpression(TypeAnalysis.java:1040)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:815)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:782)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:778)
            //     at com.strobel.decompiler.ast.TypeAnalysis.doInferTypeForExpression(TypeAnalysis.java:1510)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:815)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:782)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:778)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferCall(TypeAnalysis.java:2483)
            //     at com.strobel.decompiler.ast.TypeAnalysis.doInferTypeForExpression(TypeAnalysis.java:1040)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:815)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:782)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:778)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferCall(TypeAnalysis.java:2483)
            //     at com.strobel.decompiler.ast.TypeAnalysis.doInferTypeForExpression(TypeAnalysis.java:1040)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:815)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:782)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:778)
            //     at com.strobel.decompiler.ast.TypeAnalysis.doInferTypeForExpression(TypeAnalysis.java:1510)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:815)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:782)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:778)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferCall(TypeAnalysis.java:2483)
            //     at com.strobel.decompiler.ast.TypeAnalysis.doInferTypeForExpression(TypeAnalysis.java:1040)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:815)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:782)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:778)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferCall(TypeAnalysis.java:2483)
            //     at com.strobel.decompiler.ast.TypeAnalysis.doInferTypeForExpression(TypeAnalysis.java:1040)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:815)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:782)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:778)
            //     at com.strobel.decompiler.ast.TypeAnalysis.doInferTypeForExpression(TypeAnalysis.java:1510)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:815)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:782)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:778)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferCall(TypeAnalysis.java:2483)
            //     at com.strobel.decompiler.ast.TypeAnalysis.doInferTypeForExpression(TypeAnalysis.java:1040)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:815)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:782)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:778)
            //     at com.strobel.decompiler.ast.TypeAnalysis.doInferTypeForExpression(TypeAnalysis.java:1083)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:815)
            //     at com.strobel.decompiler.ast.TypeAnalysis.runInference(TypeAnalysis.java:684)
            //     at com.strobel.decompiler.ast.TypeAnalysis.runInference(TypeAnalysis.java:667)
            //     at com.strobel.decompiler.ast.TypeAnalysis.runInference(TypeAnalysis.java:373)
            //     at com.strobel.decompiler.ast.TypeAnalysis.run(TypeAnalysis.java:95)
            //     at com.strobel.decompiler.ast.AstOptimizer.optimize(AstOptimizer.java:344)
            //     at com.strobel.decompiler.ast.AstOptimizer.optimize(AstOptimizer.java:42)
            //     at com.strobel.decompiler.languages.java.ast.AstMethodBodyBuilder.createMethodBody(AstMethodBodyBuilder.java:206)
            //     at com.strobel.decompiler.languages.java.ast.AstMethodBodyBuilder.createMethodBody(AstMethodBodyBuilder.java:93)
            //     at com.strobel.decompiler.languages.java.ast.AstBuilder.createMethodBody(AstBuilder.java:868)
            //     at com.strobel.decompiler.languages.java.ast.AstBuilder.createMethod(AstBuilder.java:761)
            //     at com.strobel.decompiler.languages.java.ast.AstBuilder.addTypeMembers(AstBuilder.java:638)
            //     at com.strobel.decompiler.languages.java.ast.AstBuilder.createTypeCore(AstBuilder.java:605)
            //     at com.strobel.decompiler.languages.java.ast.AstBuilder.createTypeNoCache(AstBuilder.java:195)
            //     at com.strobel.decompiler.languages.java.ast.AstBuilder.addTypeMembers(AstBuilder.java:662)
            //     at com.strobel.decompiler.languages.java.ast.AstBuilder.createTypeCore(AstBuilder.java:605)
            //     at com.strobel.decompiler.languages.java.ast.AstBuilder.createTypeNoCache(AstBuilder.java:195)
            //     at com.strobel.decompiler.languages.java.ast.AstBuilder.createType(AstBuilder.java:162)
            //     at com.strobel.decompiler.languages.java.ast.AstBuilder.addType(AstBuilder.java:137)
            //     at com.strobel.decompiler.languages.java.JavaLanguage.buildAst(JavaLanguage.java:71)
            //     at com.strobel.decompiler.languages.java.JavaLanguage.decompileType(JavaLanguage.java:59)
            //     at com.strobel.decompiler.DecompilerDriver.decompileType(DecompilerDriver.java:333)
            //     at com.strobel.decompiler.DecompilerDriver.decompileJar(DecompilerDriver.java:254)
            //     at com.strobel.decompiler.DecompilerDriver.main(DecompilerDriver.java:129)
            // 
            throw new IllegalStateException("An error occurred while decompiling this method.");
        }
    }
    
    public enum Action
    {
        Load, 
        OpenSavePropertiesDialog, 
        CancelSavePropertiesDialog, 
        SavePropertiesConfig, 
        ApplySavedProperties, 
        Cancel, 
        CancelLoading, 
        SavePropertiesNameChanged, 
        OpenBrowser, 
        BrowserNavigate, 
        BrowserRootChanged, 
        BrowserSearch, 
        AddFolderToList, 
        ConfirmBrowser, 
        CancelBrowser;
    }
}
