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

package com.hypixel.hytale.builtin.adventure.objectives;

import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import com.hypixel.hytale.server.core.modules.entity.component.TransformComponent;
import com.hypixel.hytale.math.vector.Vector3d;
import com.hypixel.hytale.function.consumer.TriConsumer;
import java.util.function.BiConsumer;
import java.util.Iterator;
import java.util.function.Consumer;
import com.hypixel.hytale.server.core.universe.world.World;
import com.hypixel.hytale.server.core.universe.Universe;
import java.util.Map;
import com.hypixel.hytale.builtin.adventure.objectives.config.completion.ObjectiveCompletionAsset;
import com.hypixel.hytale.component.ComponentAccessor;
import com.hypixel.hytale.server.core.Message;
import com.hypixel.hytale.protocol.Packet;
import com.hypixel.hytale.component.Ref;
import com.hypixel.hytale.server.core.universe.PlayerRef;
import com.hypixel.hytale.protocol.packets.assets.TrackOrUpdateObjective;
import com.hypixel.hytale.builtin.adventure.objectives.transaction.TransactionRecord;
import java.util.Arrays;
import com.hypixel.hytale.builtin.adventure.objectives.transaction.TransactionUtil;
import com.hypixel.hytale.builtin.adventure.objectives.config.task.ObjectiveTaskAsset;
import java.util.logging.Level;
import com.hypixel.hytale.server.core.universe.world.storage.EntityStore;
import com.hypixel.hytale.component.Store;
import com.hypixel.hytale.builtin.adventure.objectives.config.task.TaskSet;
import java.util.Objects;
import com.hypixel.hytale.builtin.adventure.objectives.config.ObjectiveLineAsset;
import java.util.concurrent.ConcurrentHashMap;
import com.hypixel.hytale.builtin.adventure.objectives.config.ObjectiveAsset;
import com.hypixel.hytale.server.core.inventory.ItemStack;
import com.hypixel.hytale.builtin.adventure.objectives.task.ObjectiveTask;
import javax.annotation.Nonnull;
import java.util.Set;
import com.hypixel.hytale.builtin.adventure.objectives.historydata.ObjectiveHistoryData;
import javax.annotation.Nullable;
import com.hypixel.hytale.builtin.adventure.objectives.historydata.ObjectiveLineHistoryData;
import java.util.UUID;
import com.hypixel.hytale.codec.builder.BuilderCodec;
import com.hypixel.hytale.server.core.io.NetworkSerializable;

public class Objective implements NetworkSerializable<com.hypixel.hytale.protocol.Objective>
{
    public static final BuilderCodec<Objective> CODEC;
    protected UUID objectiveUUID;
    protected String objectiveId;
    @Nullable
    protected ObjectiveLineHistoryData objectiveLineHistoryData;
    protected ObjectiveHistoryData objectiveHistoryData;
    protected Set<UUID> playerUUIDs;
    @Nonnull
    protected Set<UUID> activePlayerUUIDs;
    @Nullable
    protected ObjectiveTask[] currentTasks;
    protected int currentTaskSetIndex;
    protected boolean completed;
    protected UUID worldUUID;
    @Nullable
    protected UUID markerUUID;
    protected boolean dirty;
    protected ItemStack objectiveItemStarter;
    
    public Objective(@Nonnull final ObjectiveAsset asset, @Nullable final UUID objectiveUUID, @Nonnull final Set<UUID> playerUUIDs, @Nonnull final UUID worldUUID, @Nullable final UUID markerUUID) {
        this.activePlayerUUIDs = (Set<UUID>)ConcurrentHashMap.newKeySet();
        this.objectiveId = asset.getId();
        this.currentTaskSetIndex = 0;
        this.playerUUIDs = playerUUIDs;
        this.worldUUID = worldUUID;
        this.objectiveUUID = ((objectiveUUID == null) ? UUID.randomUUID() : objectiveUUID);
        this.markerUUID = markerUUID;
        this.objectiveHistoryData = new ObjectiveHistoryData(asset.getId(), asset.getCategory());
    }
    
    protected Objective() {
        this.activePlayerUUIDs = (Set<UUID>)ConcurrentHashMap.newKeySet();
    }
    
    @Nonnull
    public UUID getObjectiveUUID() {
        return this.objectiveUUID;
    }
    
    @Nonnull
    public String getObjectiveId() {
        return this.objectiveId;
    }
    
    @Nullable
    public ObjectiveAsset getObjectiveAsset() {
        return ObjectiveAsset.getAssetMap().getAsset(this.objectiveId);
    }
    
    @Nullable
    public ObjectiveLineHistoryData getObjectiveLineHistoryData() {
        return this.objectiveLineHistoryData;
    }
    
    public void setObjectiveLineHistoryData(@Nullable final ObjectiveLineHistoryData objectiveLineHistoryData) {
        this.objectiveLineHistoryData = objectiveLineHistoryData;
    }
    
    @Nonnull
    public ObjectiveHistoryData getObjectiveHistoryData() {
        return this.objectiveHistoryData;
    }
    
    @Nullable
    public ObjectiveLineAsset getObjectiveLineAsset() {
        if (this.objectiveLineHistoryData == null) {
            return null;
        }
        return ObjectiveLineAsset.getAssetMap().getAsset(this.objectiveLineHistoryData.getId());
    }
    
    public Set<UUID> getPlayerUUIDs() {
        return this.playerUUIDs;
    }
    
    @Nonnull
    public Set<UUID> getActivePlayerUUIDs() {
        return this.activePlayerUUIDs;
    }
    
    @Nullable
    public ObjectiveTask[] getCurrentTasks() {
        return this.currentTasks;
    }
    
    public int getCurrentTaskSetIndex() {
        return this.currentTaskSetIndex;
    }
    
    public String getCurrentDescription() {
        final ObjectiveAsset objectiveAsset = Objects.requireNonNull(this.getObjectiveAsset());
        final TaskSet currentTaskSet = objectiveAsset.getTaskSets()[this.currentTaskSetIndex];
        return (currentTaskSet.getDescriptionId() != null) ? currentTaskSet.getDescriptionKey(this.objectiveId, this.currentTaskSetIndex) : objectiveAsset.getDescriptionKey();
    }
    
    public boolean isCompleted() {
        return this.completed;
    }
    
    public UUID getWorldUUID() {
        return this.worldUUID;
    }
    
    @Nullable
    public UUID getMarkerUUID() {
        return this.markerUUID;
    }
    
    public boolean isDirty() {
        return this.dirty;
    }
    
    public ItemStack getObjectiveItemStarter() {
        return this.objectiveItemStarter;
    }
    
    public void setObjectiveItemStarter(@Nonnull final ItemStack objectiveItemStarter) {
        this.objectiveItemStarter = objectiveItemStarter;
    }
    
    public boolean setup(@Nonnull final Store<EntityStore> componentAccessor) {
        final ObjectiveAsset objectiveAsset = Objects.requireNonNull(this.getObjectiveAsset());
        final ObjectivePlugin objectiveModule = ObjectivePlugin.get();
        final TaskSet[] taskSets = objectiveAsset.getTaskSets();
        if (this.currentTaskSetIndex >= taskSets.length) {
            objectiveModule.getLogger().at(Level.WARNING).log("Current taskSet index is higher than total number of taskSets for objective %s", this.objectiveId);
            return false;
        }
        final ObjectiveTaskAsset[] tasks = taskSets[this.currentTaskSetIndex].getTasks();
        final ObjectiveTask[] newTasks = new ObjectiveTask[tasks.length];
        for (int i = 0; i < tasks.length; ++i) {
            newTasks[i] = objectiveModule.createTask(tasks[i], this.currentTaskSetIndex, i);
        }
        this.currentTasks = newTasks;
        return this.setupCurrentTasks(componentAccessor);
    }
    
    public boolean setupCurrentTasks(@Nonnull final Store<EntityStore> store) {
        for (final ObjectiveTask task : this.currentTasks) {
            if (!task.isComplete()) {
                final TransactionRecord[] taskTransactions = task.setup(this, store);
                if (taskTransactions != null) {
                    if (TransactionUtil.anyFailed(taskTransactions)) {
                        ObjectivePlugin.get().getLogger().at(Level.WARNING).log("Failed to setup objective tasks, transaction records:%s", Arrays.toString(taskTransactions));
                        for (final ObjectiveTask taskSetup : this.currentTasks) {
                            taskSetup.revertTransactionRecords();
                            if (taskSetup == task) {
                                break;
                            }
                        }
                        return false;
                    }
                }
            }
        }
        return true;
    }
    
    public boolean checkTaskSetCompletion(@Nonnull final Store<EntityStore> store) {
        for (final ObjectiveTask task : this.currentTasks) {
            if (!task.isComplete()) {
                return false;
            }
        }
        this.taskSetComplete(store);
        return true;
    }
    
    protected void taskSetComplete(@Nonnull final Store<EntityStore> store) {
        final ObjectiveAsset objectiveAsset = Objects.requireNonNull(this.getObjectiveAsset());
        ++this.currentTaskSetIndex;
        final TaskSet[] taskSets = objectiveAsset.getTaskSets();
        if (this.currentTaskSetIndex >= taskSets.length) {
            this.complete(store);
            return;
        }
        if (!this.setup(store)) {
            this.taskSetComplete(store);
            return;
        }
        final TrackOrUpdateObjective trackObjectivePacket = new TrackOrUpdateObjective(this.toPacket());
        this.forEachParticipant((participantReference, message, trackOrUpdateObjective) -> {
            final PlayerRef playerRefComponent = store.getComponent(participantReference, PlayerRef.getComponentType());
            if (playerRefComponent != null) {
                playerRefComponent.sendMessage(message);
                playerRefComponent.getPacketHandler().writeNoCache(trackOrUpdateObjective);
            }
            return;
        }, this.getTaskInfoMessage(), trackObjectivePacket);
        this.checkTaskSetCompletion(store);
    }
    
    public void complete(@Nonnull final Store<EntityStore> store) {
        final ObjectiveAsset objectiveAsset = Objects.requireNonNull(this.getObjectiveAsset());
        this.forEachParticipant((participantReference, message) -> {
            final PlayerRef playerRefComponent = store.getComponent(participantReference, PlayerRef.getComponentType());
            if (playerRefComponent != null) {
                playerRefComponent.sendMessage(message);
            }
            return;
        }, Message.translation("server.modules.objective.completed").param("title", Message.translation(objectiveAsset.getTitleKey())));
        final ObjectivePlugin objectiveModule = ObjectivePlugin.get();
        final ObjectiveCompletionAsset[] completionHandlerAssets = objectiveAsset.getCompletionHandlers();
        if (completionHandlerAssets != null) {
            for (final ObjectiveCompletionAsset objectiveCompletionAsset : completionHandlerAssets) {
                objectiveModule.createCompletion(objectiveCompletionAsset).handle(this, store);
            }
        }
        this.completed = true;
        objectiveModule.objectiveCompleted(this, store);
    }
    
    public void cancel() {
        for (final ObjectiveTask currentTask : this.currentTasks) {
            currentTask.revertTransactionRecords();
        }
    }
    
    public void unload() {
        for (final ObjectiveTask currentTask : this.currentTasks) {
            currentTask.unloadTransactionRecords();
        }
    }
    
    @Nonnull
    public Message getTaskInfoMessage() {
        final Message info = Message.translation(this.getCurrentDescription());
        for (final ObjectiveTask task : this.currentTasks) {
            info.insert("\n").insert(task.getInfoMessage(this));
        }
        return info;
    }
    
    public void reloadObjectiveAsset(@Nonnull final Map<String, ObjectiveAsset> reloadedAssets) {
        final ObjectiveTaskAsset[] taskAssets = this.checkPossibleAssetReload(reloadedAssets);
        if (taskAssets == null) {
            return;
        }
        final World world = Universe.get().getWorld(this.worldUUID);
        if (world == null) {
            return;
        }
        world.execute(() -> {
            final Store<EntityStore> store = world.getEntityStore().getStore();
            final ObjectiveTask[] newTasks = this.setupAndUpdateTasks(taskAssets, store);
            if (newTasks != null) {
                this.revertRemovedTasks(newTasks);
                this.currentTasks = newTasks;
                for (final ObjectiveTask currentTask : this.currentTasks) {
                    currentTask.assetChanged(this);
                }
                if (!this.checkTaskSetCompletion(store)) {
                    final TrackOrUpdateObjective updatePacket = new TrackOrUpdateObjective(this.toPacket());
                    this.forEachParticipant((participantReference, packet) -> {
                        final PlayerRef playerRefComponent = store.getComponent(participantReference, PlayerRef.getComponentType());
                        if (playerRefComponent != null) {
                            playerRefComponent.getPacketHandler().writeNoCache(packet);
                        }
                    }, updatePacket);
                }
            }
        });
    }
    
    @Nullable
    private ObjectiveTaskAsset[] checkPossibleAssetReload(@Nonnull final Map<String, ObjectiveAsset> reloadedAssets) {
        final ObjectiveLineAsset objectiveLineAsset = this.getObjectiveLineAsset();
        if (this.objectiveLineHistoryData != null && objectiveLineAsset == null) {
            this.cancel();
            return null;
        }
        final ObjectiveAsset objectiveAsset = reloadedAssets.get(this.objectiveId);
        if (objectiveAsset == null) {
            return null;
        }
        final TaskSet[] taskSets = objectiveAsset.getTaskSets();
        if (this.currentTaskSetIndex > taskSets.length) {
            this.cancel();
            return null;
        }
        return taskSets[this.currentTaskSetIndex].getTasks();
    }
    
    @Nullable
    private ObjectiveTask[] setupAndUpdateTasks(@Nonnull final ObjectiveTaskAsset[] taskAssets, @Nonnull final Store<EntityStore> store) {
        final ObjectiveTask[] newTasks = new ObjectiveTask[taskAssets.length];
        for (int i = 0; i < taskAssets.length; ++i) {
            final ObjectiveTaskAsset taskAsset = taskAssets[i];
            final ObjectiveTask objectiveTask = this.findMatchingObjectiveTask(taskAsset);
            if (objectiveTask != null) {
                objectiveTask.setAsset(taskAsset);
                newTasks[i] = objectiveTask;
            }
            else {
                final ObjectiveTask[] array = newTasks;
                final int n = i;
                final ObjectiveTask task = ObjectivePlugin.get().createTask(taskAsset, this.currentTaskSetIndex, i);
                array[n] = task;
                final ObjectiveTask newTask = task;
                final TransactionRecord[] transactionRecords = newTask.setup(this, store);
                if (TransactionUtil.anyFailed(transactionRecords)) {
                    this.cancelReload(newTasks);
                    return null;
                }
            }
        }
        return newTasks;
    }
    
    @Nullable
    private ObjectiveTask findMatchingObjectiveTask(@Nonnull final ObjectiveTaskAsset taskAsset) {
        for (final ObjectiveTask objectiveTask : this.currentTasks) {
            if (objectiveTask.getAsset().matchesAsset(taskAsset)) {
                return objectiveTask;
            }
        }
        return null;
    }
    
    private void cancelReload(@Nonnull final ObjectiveTask[] newTasks) {
        for (final ObjectiveTask taskToRevert : newTasks) {
            if (taskToRevert != null) {
                taskToRevert.revertTransactionRecords();
            }
        }
        this.cancel();
        this.currentTasks = null;
    }
    
    private void revertRemovedTasks(@Nonnull final ObjectiveTask[] newTasks) {
        for (final ObjectiveTask objectiveTask : this.currentTasks) {
            boolean foundMatchingTask = false;
            for (final ObjectiveTask newTask : newTasks) {
                if (newTask.equals(objectiveTask)) {
                    foundMatchingTask = true;
                    break;
                }
            }
            if (!foundMatchingTask) {
                objectiveTask.revertTransactionRecords();
            }
        }
    }
    
    public void forEachParticipant(@Nonnull final Consumer<Ref<EntityStore>> consumer) {
        for (final UUID playerUUID : this.playerUUIDs) {
            final PlayerRef playerRef = Universe.get().getPlayer(playerUUID);
            if (playerRef == null) {
                continue;
            }
            consumer.accept(playerRef.getReference());
        }
    }
    
    public <T> void forEachParticipant(@Nonnull final BiConsumer<Ref<EntityStore>, T> consumer, final T meta) {
        for (final UUID playerUUID : this.playerUUIDs) {
            final PlayerRef playerRef = Universe.get().getPlayer(playerUUID);
            if (playerRef == null) {
                continue;
            }
            consumer.accept(playerRef.getReference(), meta);
        }
    }
    
    public <T, U> void forEachParticipant(@Nonnull final TriConsumer<Ref<EntityStore>, T, U> consumer, @Nonnull final T t, @Nonnull final U u) {
        for (final UUID playerUUID : this.playerUUIDs) {
            final PlayerRef playerRef = Universe.get().getPlayer(playerUUID);
            if (playerRef == null) {
                continue;
            }
            consumer.accept(playerRef.getReference(), t, u);
        }
    }
    
    @Nullable
    public Vector3d getPosition(@Nonnull final ComponentAccessor<EntityStore> componentAccessor) {
        UUID entityUUIDToFind = null;
        if (this.markerUUID != null) {
            entityUUIDToFind = this.markerUUID;
        }
        else if (!this.playerUUIDs.isEmpty()) {
            entityUUIDToFind = this.playerUUIDs.iterator().next();
        }
        if (entityUUIDToFind == null) {
            return null;
        }
        final World world = componentAccessor.getExternalData().getWorld();
        final Ref<EntityStore> markerEntityReference = world.getEntityRef(entityUUIDToFind);
        if (markerEntityReference == null || !markerEntityReference.isValid()) {
            return null;
        }
        final TransformComponent transformComponent = componentAccessor.getComponent(markerEntityReference, TransformComponent.getComponentType());
        return (transformComponent != null) ? transformComponent.getPosition() : null;
    }
    
    public void addActivePlayerUUID(final UUID playerUUID) {
        this.activePlayerUUIDs.add(playerUUID);
    }
    
    public void removeActivePlayerUUID(final UUID playerUUID) {
        this.activePlayerUUIDs.remove(playerUUID);
    }
    
    public void markDirty() {
        this.dirty = true;
    }
    
    public boolean consumeDirty() {
        final boolean previous = this.dirty;
        this.dirty = false;
        return previous;
    }
    
    @Nonnull
    @Override
    public com.hypixel.hytale.protocol.Objective toPacket() {
        final ObjectiveAsset objectiveAsset = Objects.requireNonNull(this.getObjectiveAsset());
        final com.hypixel.hytale.protocol.Objective packet = new com.hypixel.hytale.protocol.Objective();
        packet.objectiveUuid = this.objectiveUUID;
        packet.objectiveTitleKey = objectiveAsset.getTitleKey();
        packet.objectiveDescriptionKey = this.getCurrentDescription();
        if (this.objectiveLineHistoryData != null) {
            packet.objectiveLineId = this.objectiveLineHistoryData.getId();
        }
        packet.tasks = new com.hypixel.hytale.protocol.ObjectiveTask[this.currentTasks.length];
        for (int i = 0; i < this.currentTasks.length; ++i) {
            packet.tasks[i] = this.currentTasks[i].toPacket(this);
        }
        return packet;
    }
    
    @Nonnull
    @Override
    public String toString() {
        return "Objective{objectiveUUID=" + String.valueOf(this.objectiveUUID) + ", objectiveId='" + this.objectiveId + "', objectiveLineHistoryData=" + String.valueOf(this.objectiveLineHistoryData) + ", objectiveHistoryData=" + String.valueOf(this.objectiveHistoryData) + ", playerUUIDs=" + String.valueOf(this.playerUUIDs) + ", activePlayerUUIDs=" + String.valueOf(this.activePlayerUUIDs) + ", currentTasks=" + Arrays.toString(this.currentTasks) + ", currentTaskSetIndex=" + this.currentTaskSetIndex + ", completed=" + this.completed + ", worldUUID=" + String.valueOf(this.worldUUID) + ", markerUUID=" + String.valueOf(this.markerUUID) + ", dirty=" + this.dirty;
    }
    
    static {
        // 
        // This method could not be decompiled.
        // 
        // Original Bytecode:
        // 
        //     2: invokedynamic   BootstrapMethod #6, 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_w           "ObjectiveUUID"
        //    17: getstatic       com/hypixel/hytale/codec/Codec.UUID_BINARY:Lcom/hypixel/hytale/codec/codecs/UUIDBinaryCodec;
        //    20: invokespecial   com/hypixel/hytale/codec/KeyedCodec.<init>:(Ljava/lang/String;Lcom/hypixel/hytale/codec/Codec;)V
        //    23: invokedynamic   BootstrapMethod #7, accept:()Ljava/util/function/BiConsumer;
        //    28: invokedynamic   BootstrapMethod #8, apply:()Ljava/util/function/Function;
        //    33: 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;
        //    36: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.add:()Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
        //    39: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
        //    42: new             Lcom/hypixel/hytale/codec/KeyedCodec;
        //    45: dup            
        //    46: ldc_w           "ObjectiveId"
        //    49: getstatic       com/hypixel/hytale/codec/Codec.STRING:Lcom/hypixel/hytale/codec/codecs/simple/StringCodec;
        //    52: invokespecial   com/hypixel/hytale/codec/KeyedCodec.<init>:(Ljava/lang/String;Lcom/hypixel/hytale/codec/Codec;)V
        //    55: invokedynamic   BootstrapMethod #9, accept:()Ljava/util/function/BiConsumer;
        //    60: invokedynamic   BootstrapMethod #10, apply:()Ljava/util/function/Function;
        //    65: 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;
        //    68: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.add:()Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
        //    71: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
        //    74: new             Lcom/hypixel/hytale/codec/KeyedCodec;
        //    77: dup            
        //    78: ldc_w           "ObjectiveLineData"
        //    81: getstatic       com/hypixel/hytale/builtin/adventure/objectives/historydata/ObjectiveLineHistoryData.CODEC:Lcom/hypixel/hytale/codec/builder/BuilderCodec;
        //    84: invokespecial   com/hypixel/hytale/codec/KeyedCodec.<init>:(Ljava/lang/String;Lcom/hypixel/hytale/codec/Codec;)V
        //    87: invokedynamic   BootstrapMethod #11, accept:()Ljava/util/function/BiConsumer;
        //    92: invokedynamic   BootstrapMethod #12, apply:()Ljava/util/function/Function;
        //    97: 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;
        //   100: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.add:()Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
        //   103: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
        //   106: new             Lcom/hypixel/hytale/codec/KeyedCodec;
        //   109: dup            
        //   110: ldc_w           "ObjectiveData"
        //   113: getstatic       com/hypixel/hytale/builtin/adventure/objectives/historydata/ObjectiveHistoryData.CODEC:Lcom/hypixel/hytale/codec/builder/BuilderCodec;
        //   116: invokespecial   com/hypixel/hytale/codec/KeyedCodec.<init>:(Ljava/lang/String;Lcom/hypixel/hytale/codec/Codec;)V
        //   119: invokedynamic   BootstrapMethod #13, accept:()Ljava/util/function/BiConsumer;
        //   124: invokedynamic   BootstrapMethod #14, apply:()Ljava/util/function/Function;
        //   129: 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;
        //   132: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.add:()Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
        //   135: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
        //   138: new             Lcom/hypixel/hytale/codec/KeyedCodec;
        //   141: dup            
        //   142: ldc_w           "Players"
        //   145: new             Lcom/hypixel/hytale/codec/codecs/array/ArrayCodec;
        //   148: dup            
        //   149: getstatic       com/hypixel/hytale/codec/Codec.UUID_STRING:Lcom/hypixel/hytale/codec/function/FunctionCodec;
        //   152: invokedynamic   BootstrapMethod #15, apply:()Ljava/util/function/IntFunction;
        //   157: invokespecial   com/hypixel/hytale/codec/codecs/array/ArrayCodec.<init>:(Lcom/hypixel/hytale/codec/Codec;Ljava/util/function/IntFunction;)V
        //   160: invokespecial   com/hypixel/hytale/codec/KeyedCodec.<init>:(Ljava/lang/String;Lcom/hypixel/hytale/codec/Codec;)V
        //   163: invokedynamic   BootstrapMethod #16, accept:()Ljava/util/function/BiConsumer;
        //   168: invokedynamic   BootstrapMethod #17, apply:()Ljava/util/function/Function;
        //   173: 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;
        //   176: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.add:()Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
        //   179: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
        //   182: new             Lcom/hypixel/hytale/codec/KeyedCodec;
        //   185: dup            
        //   186: ldc_w           "CurrentTasks"
        //   189: new             Lcom/hypixel/hytale/codec/codecs/array/ArrayCodec;
        //   192: dup            
        //   193: getstatic       com/hypixel/hytale/builtin/adventure/objectives/task/ObjectiveTask.CODEC:Lcom/hypixel/hytale/codec/lookup/CodecMapCodec;
        //   196: invokedynamic   BootstrapMethod #18, apply:()Ljava/util/function/IntFunction;
        //   201: invokespecial   com/hypixel/hytale/codec/codecs/array/ArrayCodec.<init>:(Lcom/hypixel/hytale/codec/Codec;Ljava/util/function/IntFunction;)V
        //   204: invokespecial   com/hypixel/hytale/codec/KeyedCodec.<init>:(Ljava/lang/String;Lcom/hypixel/hytale/codec/Codec;)V
        //   207: invokedynamic   BootstrapMethod #19, accept:()Ljava/util/function/BiConsumer;
        //   212: invokedynamic   BootstrapMethod #20, apply:()Ljava/util/function/Function;
        //   217: 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;
        //   220: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.add:()Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
        //   223: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
        //   226: new             Lcom/hypixel/hytale/codec/KeyedCodec;
        //   229: dup            
        //   230: ldc_w           "CurrentTaskSetIndex"
        //   233: getstatic       com/hypixel/hytale/codec/Codec.INTEGER:Lcom/hypixel/hytale/codec/codecs/simple/IntegerCodec;
        //   236: invokespecial   com/hypixel/hytale/codec/KeyedCodec.<init>:(Ljava/lang/String;Lcom/hypixel/hytale/codec/Codec;)V
        //   239: invokedynamic   BootstrapMethod #21, accept:()Ljava/util/function/BiConsumer;
        //   244: invokedynamic   BootstrapMethod #22, apply:()Ljava/util/function/Function;
        //   249: 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;
        //   252: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.add:()Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
        //   255: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
        //   258: new             Lcom/hypixel/hytale/codec/KeyedCodec;
        //   261: dup            
        //   262: ldc_w           "WorldUUID"
        //   265: getstatic       com/hypixel/hytale/codec/Codec.UUID_BINARY:Lcom/hypixel/hytale/codec/codecs/UUIDBinaryCodec;
        //   268: invokespecial   com/hypixel/hytale/codec/KeyedCodec.<init>:(Ljava/lang/String;Lcom/hypixel/hytale/codec/Codec;)V
        //   271: invokedynamic   BootstrapMethod #23, accept:()Ljava/util/function/BiConsumer;
        //   276: invokedynamic   BootstrapMethod #24, apply:()Ljava/util/function/Function;
        //   281: 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;
        //   284: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.add:()Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
        //   287: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
        //   290: new             Lcom/hypixel/hytale/codec/KeyedCodec;
        //   293: dup            
        //   294: ldc_w           "ObjectiveItemStarter"
        //   297: getstatic       com/hypixel/hytale/server/core/inventory/ItemStack.CODEC:Lcom/hypixel/hytale/codec/builder/BuilderCodec;
        //   300: invokespecial   com/hypixel/hytale/codec/KeyedCodec.<init>:(Ljava/lang/String;Lcom/hypixel/hytale/codec/Codec;)V
        //   303: invokedynamic   BootstrapMethod #25, accept:()Ljava/util/function/BiConsumer;
        //   308: invokedynamic   BootstrapMethod #26, apply:()Ljava/util/function/Function;
        //   313: 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;
        //   316: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.add:()Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
        //   319: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
        //   322: invokevirtual   com/hypixel/hytale/codec/builder/BuilderCodec$Builder.build:()Lcom/hypixel/hytale/codec/builder/BuilderCodec;
        //   325: putstatic       com/hypixel/hytale/builtin/adventure/objectives/Objective.CODEC:Lcom/hypixel/hytale/codec/builder/BuilderCodec;
        //   328: 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.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.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.");
    }
}
