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

package com.hypixel.hytale.server.spawning.assets.spawns.config;

import java.lang.invoke.CallSite;
import java.lang.reflect.UndeclaredThrowableException;
import java.lang.invoke.MethodHandle;
import java.lang.invoke.StringConcatFactory;
import java.lang.invoke.MethodType;
import java.lang.invoke.MethodHandles;
import com.hypixel.hytale.assetstore.map.IndexedLookupTableAssetMap;
import com.hypixel.hytale.server.core.asset.type.environment.config.Environment;
import it.unimi.dsi.fastutil.ints.IntOpenHashSet;
import java.util.stream.Collector;
import java.util.stream.Collectors;
import java.util.Arrays;
import it.unimi.dsi.fastutil.ints.IntSets;
import javax.annotation.Nonnull;
import com.hypixel.hytale.codec.validation.ValidationResults;
import com.hypixel.hytale.server.spawning.assets.spawns.LightType;
import java.util.Map;
import it.unimi.dsi.fastutil.ints.IntSet;
import com.hypixel.hytale.assetstore.AssetExtraInfo;
import com.hypixel.hytale.codec.builder.BuilderCodec;

public abstract class NPCSpawn
{
    public static final float HOURS_PER_DAY = 24.0f;
    public static final BuilderCodec<NPCSpawn> BASE_CODEC;
    public static final double[] DEFAULT_DAY_TIME_RANGE;
    public static final int[] DEFAULT_MOON_PHASE_RANGE;
    public static final double[] FULL_LIGHT_RANGE;
    protected AssetExtraInfo.Data data;
    protected String id;
    protected RoleSpawnParameters[] npcs;
    protected DespawnParameters despawnParameters;
    protected String[] environments;
    protected IntSet environmentIds;
    protected double[] dayTimeRange;
    protected int[] moonPhaseRange;
    protected Map<LightType, double[]> lightTypeMap;
    protected boolean scaleDayTimeRange;
    
    private static void validateLightRange(@Nonnull final ValidationResults results, final String parameter, @Nonnull final double[] lightRange) {
        for (int i = 0; i < lightRange.length; ++i) {
            final double value = lightRange[i];
            if (value < 0.0 || value > 100.0) {
                results.fail(String.format("%s must be between 0 and 100 (inclusive)", parameter));
            }
            if (i > 0 && value < lightRange[i - 1]) {
                results.fail(String.format("Values in %s must be weakly monotonic", parameter));
            }
        }
    }
    
    public NPCSpawn(final String id, final RoleSpawnParameters[] npcs, final DespawnParameters despawnParameters, final String[] environments, final IntSet environmentIds, final double[] dayTimeRange, final int[] moonPhaseRange, final Map<LightType, double[]> lightTypeMap, final boolean scaleDayTimeRange) {
        this.environmentIds = IntSets.EMPTY_SET;
        this.dayTimeRange = NPCSpawn.DEFAULT_DAY_TIME_RANGE;
        this.moonPhaseRange = NPCSpawn.DEFAULT_MOON_PHASE_RANGE;
        this.scaleDayTimeRange = true;
        this.id = id;
        this.npcs = npcs;
        this.despawnParameters = despawnParameters;
        this.environments = environments;
        this.environmentIds = environmentIds;
        this.dayTimeRange = dayTimeRange;
        this.moonPhaseRange = moonPhaseRange;
        this.lightTypeMap = lightTypeMap;
        this.scaleDayTimeRange = scaleDayTimeRange;
    }
    
    protected NPCSpawn(final String id) {
        this.environmentIds = IntSets.EMPTY_SET;
        this.dayTimeRange = NPCSpawn.DEFAULT_DAY_TIME_RANGE;
        this.moonPhaseRange = NPCSpawn.DEFAULT_MOON_PHASE_RANGE;
        this.scaleDayTimeRange = true;
        this.id = id;
    }
    
    protected NPCSpawn() {
        this.environmentIds = IntSets.EMPTY_SET;
        this.dayTimeRange = NPCSpawn.DEFAULT_DAY_TIME_RANGE;
        this.moonPhaseRange = NPCSpawn.DEFAULT_MOON_PHASE_RANGE;
        this.scaleDayTimeRange = true;
    }
    
    public abstract String getId();
    
    public RoleSpawnParameters[] getNPCs() {
        return this.npcs;
    }
    
    public DespawnParameters getDespawnParameters() {
        return this.despawnParameters;
    }
    
    public String[] getEnvironments() {
        return this.environments;
    }
    
    public IntSet getEnvironmentIds() {
        return this.environmentIds;
    }
    
    public double[] getDayTimeRange() {
        return this.dayTimeRange;
    }
    
    public int[] getMoonPhaseRange() {
        return this.moonPhaseRange;
    }
    
    public double[] getLightRange(final LightType lightType) {
        if (this.lightTypeMap != null && !this.lightTypeMap.isEmpty()) {
            final double[] array = this.lightTypeMap.get(lightType);
            if (array != null) {
                return array;
            }
        }
        return NPCSpawn.FULL_LIGHT_RANGE;
    }
    
    public boolean isScaleDayTimeRange() {
        return this.scaleDayTimeRange;
    }
    
    @Nonnull
    @Override
    public String toString() {
        return "NPCSpawn{id='" + this.id + "', npcs=" + Arrays.deepToString(this.npcs) + ", despawnParameters=" + ((this.despawnParameters != null) ? this.despawnParameters.toString() : "Null") + ", environments=" + Arrays.toString(this.environments) + ", dayTimeRange=" + Arrays.toString(this.dayTimeRange) + ", moonPhaseRange=" + Arrays.toString(this.moonPhaseRange) + ", lightTypeMap=" + ((this.lightTypeMap != null) ? this.lightTypeMap.entrySet().stream().map(entry -> /* invokedynamic(!) */ProcyonInvokeDynamicHelper_16.invoke(String.valueOf(entry.getKey()), Arrays.toString(entry.getValue()))).collect((Collector<? super Object, ?, String>)Collectors.joining(", ", "{", "}")) : "Null") + ", scaleDayTimeRange=" + this.scaleDayTimeRange;
    }
    
    static {
        // 
        // This method could not be decompiled.
        // 
        // Original Bytecode:
        // 
        //     2: invokestatic    com/hypixel/hytale/assetstore/codec/AssetBuilderCodec.abstractBuilder:(Ljava/lang/Class;)Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
        //     5: ldc             "A specification for spawning NPCs, including spawn and despawn parameters."
        //     7: invokevirtual   com/hypixel/hytale/codec/builder/BuilderCodec$Builder.documentation:(Ljava/lang/String;)Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
        //    10: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
        //    13: new             Lcom/hypixel/hytale/codec/KeyedCodec;
        //    16: dup            
        //    17: ldc_w           "NPCs"
        //    20: new             Lcom/hypixel/hytale/codec/codecs/array/ArrayCodec;
        //    23: dup            
        //    24: getstatic       com/hypixel/hytale/server/spawning/assets/spawns/config/RoleSpawnParameters.CODEC:Lcom/hypixel/hytale/codec/builder/BuilderCodec;
        //    27: invokedynamic   BootstrapMethod #3, apply:()Ljava/util/function/IntFunction;
        //    32: invokespecial   com/hypixel/hytale/codec/codecs/array/ArrayCodec.<init>:(Lcom/hypixel/hytale/codec/Codec;Ljava/util/function/IntFunction;)V
        //    35: invokespecial   com/hypixel/hytale/codec/KeyedCodec.<init>:(Ljava/lang/String;Lcom/hypixel/hytale/codec/Codec;)V
        //    38: invokedynamic   BootstrapMethod #4, accept:()Ljava/util/function/BiConsumer;
        //    43: invokedynamic   BootstrapMethod #5, apply:()Ljava/util/function/Function;
        //    48: invokedynamic   BootstrapMethod #6, accept:()Ljava/util/function/BiConsumer;
        //    53: invokevirtual   com/hypixel/hytale/codec/builder/BuilderCodec$Builder.appendInherited:(Lcom/hypixel/hytale/codec/KeyedCodec;Ljava/util/function/BiConsumer;Ljava/util/function/Function;Ljava/util/function/BiConsumer;)Lcom/hypixel/hytale/codec/builder/BuilderField$FieldBuilder;
        //    56: ldc_w           "A required list of **Role Spawn Parameters** defining each NPC that can be spawned and their relative weights."
        //    59: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.documentation:(Ljava/lang/String;)Lcom/hypixel/hytale/codec/builder/BuilderField$FieldBuilder;
        //    62: new             Lcom/hypixel/hytale/codec/schema/metadata/ui/UIPropertyTitle;
        //    65: dup            
        //    66: ldc_w           "NPCs"
        //    69: invokespecial   com/hypixel/hytale/codec/schema/metadata/ui/UIPropertyTitle.<init>:(Ljava/lang/String;)V
        //    72: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.metadata:(Lcom/hypixel/hytale/codec/schema/metadata/Metadata;)Lcom/hypixel/hytale/codec/builder/BuilderField$FieldBuilder;
        //    75: invokestatic    com/hypixel/hytale/codec/validation/Validators.nonNull:()Lcom/hypixel/hytale/codec/validation/Validator;
        //    78: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.addValidator:(Lcom/hypixel/hytale/codec/validation/Validator;)Lcom/hypixel/hytale/codec/builder/BuilderField$FieldBuilder;
        //    81: invokestatic    com/hypixel/hytale/codec/validation/Validators.nonEmptyArray:()Lcom/hypixel/hytale/codec/validation/Validator;
        //    84: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.addValidator:(Lcom/hypixel/hytale/codec/validation/Validator;)Lcom/hypixel/hytale/codec/builder/BuilderField$FieldBuilder;
        //    87: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.add:()Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
        //    90: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
        //    93: new             Lcom/hypixel/hytale/codec/KeyedCodec;
        //    96: dup            
        //    97: ldc_w           "Despawn"
        //   100: getstatic       com/hypixel/hytale/server/spawning/assets/spawns/config/NPCSpawn$DespawnParameters.CODEC:Lcom/hypixel/hytale/codec/builder/BuilderCodec;
        //   103: invokespecial   com/hypixel/hytale/codec/KeyedCodec.<init>:(Ljava/lang/String;Lcom/hypixel/hytale/codec/Codec;)V
        //   106: invokedynamic   BootstrapMethod #7, accept:()Ljava/util/function/BiConsumer;
        //   111: invokedynamic   BootstrapMethod #8, apply:()Ljava/util/function/Function;
        //   116: invokedynamic   BootstrapMethod #9, accept:()Ljava/util/function/BiConsumer;
        //   121: invokevirtual   com/hypixel/hytale/codec/builder/BuilderCodec$Builder.appendInherited:(Lcom/hypixel/hytale/codec/KeyedCodec;Ljava/util/function/BiConsumer;Ljava/util/function/Function;Ljava/util/function/BiConsumer;)Lcom/hypixel/hytale/codec/builder/BuilderField$FieldBuilder;
        //   124: ldc_w           "Optional **Despawn Parameters** to control NPC despawning."
        //   127: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.documentation:(Ljava/lang/String;)Lcom/hypixel/hytale/codec/builder/BuilderField$FieldBuilder;
        //   130: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.add:()Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
        //   133: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
        //   136: new             Lcom/hypixel/hytale/codec/KeyedCodec;
        //   139: dup            
        //   140: ldc_w           "DayTimeRange"
        //   143: getstatic       com/hypixel/hytale/codec/Codec.DOUBLE_ARRAY:Lcom/hypixel/hytale/codec/codecs/array/DoubleArrayCodec;
        //   146: invokespecial   com/hypixel/hytale/codec/KeyedCodec.<init>:(Ljava/lang/String;Lcom/hypixel/hytale/codec/Codec;)V
        //   149: invokedynamic   BootstrapMethod #10, accept:()Ljava/util/function/BiConsumer;
        //   154: invokedynamic   BootstrapMethod #11, apply:()Ljava/util/function/Function;
        //   159: invokedynamic   BootstrapMethod #12, accept:()Ljava/util/function/BiConsumer;
        //   164: invokevirtual   com/hypixel/hytale/codec/builder/BuilderCodec$Builder.appendInherited:(Lcom/hypixel/hytale/codec/KeyedCodec;Ljava/util/function/BiConsumer;Ljava/util/function/Function;Ljava/util/function/BiConsumer;)Lcom/hypixel/hytale/codec/builder/BuilderField$FieldBuilder;
        //   167: ldc_w           "An optional hour range within which the NPCs/beacon will spawn (between 0 and 24)."
        //   170: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.documentation:(Ljava/lang/String;)Lcom/hypixel/hytale/codec/builder/BuilderField$FieldBuilder;
        //   173: iconst_2       
        //   174: invokestatic    com/hypixel/hytale/codec/validation/Validators.doubleArraySize:(I)Lcom/hypixel/hytale/codec/validation/Validator;
        //   177: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.addValidator:(Lcom/hypixel/hytale/codec/validation/Validator;)Lcom/hypixel/hytale/codec/builder/BuilderField$FieldBuilder;
        //   180: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.add:()Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
        //   183: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
        //   186: new             Lcom/hypixel/hytale/codec/KeyedCodec;
        //   189: dup            
        //   190: ldc_w           "MoonPhaseRange"
        //   193: getstatic       com/hypixel/hytale/codec/Codec.INT_ARRAY:Lcom/hypixel/hytale/codec/codecs/array/IntArrayCodec;
        //   196: invokespecial   com/hypixel/hytale/codec/KeyedCodec.<init>:(Ljava/lang/String;Lcom/hypixel/hytale/codec/Codec;)V
        //   199: invokedynamic   BootstrapMethod #13, accept:()Ljava/util/function/BiConsumer;
        //   204: invokedynamic   BootstrapMethod #14, apply:()Ljava/util/function/Function;
        //   209: invokedynamic   BootstrapMethod #15, accept:()Ljava/util/function/BiConsumer;
        //   214: invokevirtual   com/hypixel/hytale/codec/builder/BuilderCodec$Builder.appendInherited:(Lcom/hypixel/hytale/codec/KeyedCodec;Ljava/util/function/BiConsumer;Ljava/util/function/Function;Ljava/util/function/BiConsumer;)Lcom/hypixel/hytale/codec/builder/BuilderField$FieldBuilder;
        //   217: ldc_w           "An optional moon phase range during which the NPCs/beacon will spawn (must be greater than or equal to 0)."
        //   220: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.documentation:(Ljava/lang/String;)Lcom/hypixel/hytale/codec/builder/BuilderField$FieldBuilder;
        //   223: iconst_2       
        //   224: invokestatic    com/hypixel/hytale/codec/validation/Validators.intArraySize:(I)Lcom/hypixel/hytale/codec/validation/Validator;
        //   227: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.addValidator:(Lcom/hypixel/hytale/codec/validation/Validator;)Lcom/hypixel/hytale/codec/builder/BuilderField$FieldBuilder;
        //   230: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.add:()Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
        //   233: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
        //   236: new             Lcom/hypixel/hytale/codec/KeyedCodec;
        //   239: dup            
        //   240: ldc_w           "LightRanges"
        //   243: new             Lcom/hypixel/hytale/codec/codecs/map/EnumMapCodec;
        //   246: dup            
        //   247: ldc             Lcom/hypixel/hytale/server/spawning/assets/spawns/LightType;.class
        //   249: getstatic       com/hypixel/hytale/codec/Codec.DOUBLE_ARRAY:Lcom/hypixel/hytale/codec/codecs/array/DoubleArrayCodec;
        //   252: invokespecial   com/hypixel/hytale/codec/codecs/map/EnumMapCodec.<init>:(Ljava/lang/Class;Lcom/hypixel/hytale/codec/Codec;)V
        //   255: getstatic       com/hypixel/hytale/server/spawning/assets/spawns/LightType.Light:Lcom/hypixel/hytale/server/spawning/assets/spawns/LightType;
        //   258: ldc_w           "Total light level."
        //   261: invokevirtual   com/hypixel/hytale/codec/codecs/map/EnumMapCodec.documentKey:(Ljava/lang/Enum;Ljava/lang/String;)Lcom/hypixel/hytale/codec/codecs/map/EnumMapCodec;
        //   264: getstatic       com/hypixel/hytale/server/spawning/assets/spawns/LightType.SkyLight:Lcom/hypixel/hytale/server/spawning/assets/spawns/LightType;
        //   267: ldc_w           "Light level based on how deep under cover the position is relative to the open sky (e.g. inside a cave will be low SkyLight)."
        //   270: invokevirtual   com/hypixel/hytale/codec/codecs/map/EnumMapCodec.documentKey:(Ljava/lang/Enum;Ljava/lang/String;)Lcom/hypixel/hytale/codec/codecs/map/EnumMapCodec;
        //   273: getstatic       com/hypixel/hytale/server/spawning/assets/spawns/LightType.Sunlight:Lcom/hypixel/hytale/server/spawning/assets/spawns/LightType;
        //   276: ldc_w           "Light level based on time of day (peaks at around noon and is 0 during most of the night)."
        //   279: invokevirtual   com/hypixel/hytale/codec/codecs/map/EnumMapCodec.documentKey:(Ljava/lang/Enum;Ljava/lang/String;)Lcom/hypixel/hytale/codec/codecs/map/EnumMapCodec;
        //   282: getstatic       com/hypixel/hytale/server/spawning/assets/spawns/LightType.RedLight:Lcom/hypixel/hytale/server/spawning/assets/spawns/LightType;
        //   285: ldc_w           "Red light level."
        //   288: invokevirtual   com/hypixel/hytale/codec/codecs/map/EnumMapCodec.documentKey:(Ljava/lang/Enum;Ljava/lang/String;)Lcom/hypixel/hytale/codec/codecs/map/EnumMapCodec;
        //   291: getstatic       com/hypixel/hytale/server/spawning/assets/spawns/LightType.GreenLight:Lcom/hypixel/hytale/server/spawning/assets/spawns/LightType;
        //   294: ldc_w           "Green light level."
        //   297: invokevirtual   com/hypixel/hytale/codec/codecs/map/EnumMapCodec.documentKey:(Ljava/lang/Enum;Ljava/lang/String;)Lcom/hypixel/hytale/codec/codecs/map/EnumMapCodec;
        //   300: getstatic       com/hypixel/hytale/server/spawning/assets/spawns/LightType.BlueLight:Lcom/hypixel/hytale/server/spawning/assets/spawns/LightType;
        //   303: ldc_w           "Blue light level."
        //   306: invokevirtual   com/hypixel/hytale/codec/codecs/map/EnumMapCodec.documentKey:(Ljava/lang/Enum;Ljava/lang/String;)Lcom/hypixel/hytale/codec/codecs/map/EnumMapCodec;
        //   309: invokespecial   com/hypixel/hytale/codec/KeyedCodec.<init>:(Ljava/lang/String;Lcom/hypixel/hytale/codec/Codec;)V
        //   312: invokedynamic   BootstrapMethod #16, accept:()Ljava/util/function/BiConsumer;
        //   317: invokedynamic   BootstrapMethod #17, apply:()Ljava/util/function/Function;
        //   322: invokedynamic   BootstrapMethod #18, accept:()Ljava/util/function/BiConsumer;
        //   327: invokevirtual   com/hypixel/hytale/codec/builder/BuilderCodec$Builder.appendInherited:(Lcom/hypixel/hytale/codec/KeyedCodec;Ljava/util/function/BiConsumer;Ljava/util/function/Function;Ljava/util/function/BiConsumer;)Lcom/hypixel/hytale/codec/builder/BuilderField$FieldBuilder;
        //   330: ldc_w           "Optional light ranges to spawn the NPCs/beacon in, defined between 0 and 100."
        //   333: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.documentation:(Ljava/lang/String;)Lcom/hypixel/hytale/codec/builder/BuilderField$FieldBuilder;
        //   336: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.add:()Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
        //   339: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
        //   342: new             Lcom/hypixel/hytale/codec/KeyedCodec;
        //   345: dup            
        //   346: ldc_w           "ScaleDayTimeRange"
        //   349: getstatic       com/hypixel/hytale/codec/Codec.BOOLEAN:Lcom/hypixel/hytale/codec/codecs/simple/BooleanCodec;
        //   352: invokespecial   com/hypixel/hytale/codec/KeyedCodec.<init>:(Ljava/lang/String;Lcom/hypixel/hytale/codec/Codec;)V
        //   355: invokedynamic   BootstrapMethod #19, accept:()Ljava/util/function/BiConsumer;
        //   360: invokedynamic   BootstrapMethod #20, apply:()Ljava/util/function/Function;
        //   365: invokedynamic   BootstrapMethod #21, accept:()Ljava/util/function/BiConsumer;
        //   370: invokevirtual   com/hypixel/hytale/codec/builder/BuilderCodec$Builder.appendInherited:(Lcom/hypixel/hytale/codec/KeyedCodec;Ljava/util/function/BiConsumer;Ljava/util/function/Function;Ljava/util/function/BiConsumer;)Lcom/hypixel/hytale/codec/builder/BuilderField$FieldBuilder;
        //   373: ldc_w           "If set to true, instead of using absolute hour values for DayTimeRange, it will be scaled based on the world's DaytimePortion.\n\n * 0 and 24 will represent the middle of the night portion.\n * 6 will represent the moment of sunrise.\n * 12 will represent the middle of the day portion.\n * 18 will represent the moment of sunset."
        //   376: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.documentation:(Ljava/lang/String;)Lcom/hypixel/hytale/codec/builder/BuilderField$FieldBuilder;
        //   379: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.add:()Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
        //   382: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
        //   385: invokedynamic   BootstrapMethod #22, accept:()Ljava/util/function/Consumer;
        //   390: invokevirtual   com/hypixel/hytale/codec/builder/BuilderCodec$Builder.afterDecode:(Ljava/util/function/Consumer;)Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
        //   393: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
        //   396: invokedynamic   BootstrapMethod #23, accept:()Ljava/util/function/BiConsumer;
        //   401: invokevirtual   com/hypixel/hytale/codec/builder/BuilderCodec$Builder.validator:(Ljava/util/function/BiConsumer;)Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
        //   404: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
        //   407: invokevirtual   com/hypixel/hytale/codec/builder/BuilderCodec$Builder.build:()Lcom/hypixel/hytale/codec/builder/BuilderCodec;
        //   410: putstatic       com/hypixel/hytale/server/spawning/assets/spawns/config/NPCSpawn.BASE_CODEC:Lcom/hypixel/hytale/codec/builder/BuilderCodec;
        //   413: iconst_2       
        //   414: newarray        D
        //   416: dup            
        //   417: iconst_0       
        //   418: dconst_0       
        //   419: dastore        
        //   420: dup            
        //   421: iconst_1       
        //   422: ldc2_w          1.7976931348623157E308
        //   425: dastore        
        //   426: putstatic       com/hypixel/hytale/server/spawning/assets/spawns/config/NPCSpawn.DEFAULT_DAY_TIME_RANGE:[D
        //   429: iconst_2       
        //   430: newarray        I
        //   432: dup            
        //   433: iconst_0       
        //   434: iconst_0       
        //   435: iastore        
        //   436: dup            
        //   437: iconst_1       
        //   438: ldc_w           2147483647
        //   441: iastore        
        //   442: putstatic       com/hypixel/hytale/server/spawning/assets/spawns/config/NPCSpawn.DEFAULT_MOON_PHASE_RANGE:[I
        //   445: iconst_2       
        //   446: newarray        D
        //   448: dup            
        //   449: iconst_0       
        //   450: dconst_0       
        //   451: dastore        
        //   452: dup            
        //   453: iconst_1       
        //   454: ldc2_w          100.0
        //   457: dastore        
        //   458: putstatic       com/hypixel/hytale/server/spawning/assets/spawns/config/NPCSpawn.FULL_LIGHT_RANGE:[D
        //   461: 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.visitParameterizedType(TypeSubstitutionVisitor.java:225)
        //     at com.strobel.assembler.metadata.TypeSubstitutionVisitor.visitParameterizedType(TypeSubstitutionVisitor.java:25)
        //     at com.strobel.assembler.metadata.ParameterizedType.accept(ParameterizedType.java:103)
        //     at com.strobel.assembler.metadata.TypeSubstitutionVisitor.visit(TypeSubstitutionVisitor.java:40)
        //     at com.strobel.assembler.metadata.TypeSubstitutionVisitor.visitMethod(TypeSubstitutionVisitor.java:314)
        //     at com.strobel.decompiler.ast.TypeAnalysis.inferCall(TypeAnalysis.java:2611)
        //     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.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.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.inferTypesForVariables(TypeAnalysis.java:593)
        //     at com.strobel.decompiler.ast.TypeAnalysis.runInference(TypeAnalysis.java:405)
        //     at com.strobel.decompiler.ast.TypeAnalysis.run(TypeAnalysis.java:95)
        //     at com.strobel.decompiler.ast.AstOptimizer.optimize(AstOptimizer.java:109)
        //     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.");
    }
    
    public static class DespawnParameters
    {
        public static final BuilderCodec<DespawnParameters> CODEC;
        protected double[] dayTimeRange;
        protected int[] moonPhaseRange;
        
        public DespawnParameters(final double[] dayTimeRange, final int[] moonPhaseRange) {
            this.dayTimeRange = NPCSpawn.DEFAULT_DAY_TIME_RANGE;
            this.moonPhaseRange = NPCSpawn.DEFAULT_MOON_PHASE_RANGE;
            this.dayTimeRange = dayTimeRange;
            this.moonPhaseRange = moonPhaseRange;
        }
        
        protected DespawnParameters() {
            this.dayTimeRange = NPCSpawn.DEFAULT_DAY_TIME_RANGE;
            this.moonPhaseRange = NPCSpawn.DEFAULT_MOON_PHASE_RANGE;
        }
        
        public double[] getDayTimeRange() {
            return this.dayTimeRange;
        }
        
        public int[] getMoonPhaseRange() {
            return this.moonPhaseRange;
        }
        
        @Nonnull
        @Override
        public String toString() {
            return "DespawnParameters{dayTimeRange=" + Arrays.toString(this.dayTimeRange) + ", moonPhaseRange=" + Arrays.toString(this.moonPhaseRange);
        }
        
        static {
            // 
            // This method could not be decompiled.
            // 
            // Original Bytecode:
            // 
            //     2: invokedynamic   BootstrapMethod #1, 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: ldc             "A set of parameters that determine if NPCs should despawn."
            //    12: invokevirtual   com/hypixel/hytale/codec/builder/BuilderCodec$Builder.documentation:(Ljava/lang/String;)Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
            //    15: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
            //    18: new             Lcom/hypixel/hytale/codec/KeyedCodec;
            //    21: dup            
            //    22: ldc             "DayTimeRange"
            //    24: getstatic       com/hypixel/hytale/codec/Codec.DOUBLE_ARRAY:Lcom/hypixel/hytale/codec/codecs/array/DoubleArrayCodec;
            //    27: invokespecial   com/hypixel/hytale/codec/KeyedCodec.<init>:(Ljava/lang/String;Lcom/hypixel/hytale/codec/Codec;)V
            //    30: invokedynamic   BootstrapMethod #2, accept:()Ljava/util/function/BiConsumer;
            //    35: invokedynamic   BootstrapMethod #3, apply:()Ljava/util/function/Function;
            //    40: 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;
            //    43: ldc             "An optional hour range within which the NPCs will despawn (between 0 and 24). For Spawn Beacons, this refers to the beacon itself."
            //    45: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.documentation:(Ljava/lang/String;)Lcom/hypixel/hytale/codec/builder/BuilderField$FieldBuilder;
            //    48: iconst_2       
            //    49: invokestatic    com/hypixel/hytale/codec/validation/Validators.doubleArraySize:(I)Lcom/hypixel/hytale/codec/validation/Validator;
            //    52: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.addValidator:(Lcom/hypixel/hytale/codec/validation/Validator;)Lcom/hypixel/hytale/codec/builder/BuilderField$FieldBuilder;
            //    55: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.add:()Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
            //    58: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
            //    61: new             Lcom/hypixel/hytale/codec/KeyedCodec;
            //    64: dup            
            //    65: ldc             "MoonPhaseRange"
            //    67: getstatic       com/hypixel/hytale/codec/Codec.INT_ARRAY:Lcom/hypixel/hytale/codec/codecs/array/IntArrayCodec;
            //    70: invokespecial   com/hypixel/hytale/codec/KeyedCodec.<init>:(Ljava/lang/String;Lcom/hypixel/hytale/codec/Codec;)V
            //    73: invokedynamic   BootstrapMethod #4, accept:()Ljava/util/function/BiConsumer;
            //    78: invokedynamic   BootstrapMethod #5, apply:()Ljava/util/function/Function;
            //    83: 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;
            //    86: ldc             "An optional moon phase range during which the NPCs will despawn (must be greater than or equal to 0). For Spawn Beacons, this refers to the beacon itself."
            //    88: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.documentation:(Ljava/lang/String;)Lcom/hypixel/hytale/codec/builder/BuilderField$FieldBuilder;
            //    91: iconst_2       
            //    92: invokestatic    com/hypixel/hytale/codec/validation/Validators.intArraySize:(I)Lcom/hypixel/hytale/codec/validation/Validator;
            //    95: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.addValidator:(Lcom/hypixel/hytale/codec/validation/Validator;)Lcom/hypixel/hytale/codec/builder/BuilderField$FieldBuilder;
            //    98: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.add:()Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
            //   101: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
            //   104: invokevirtual   com/hypixel/hytale/codec/builder/BuilderCodec$Builder.build:()Lcom/hypixel/hytale/codec/builder/BuilderCodec;
            //   107: putstatic       com/hypixel/hytale/server/spawning/assets/spawns/config/NPCSpawn$DespawnParameters.CODEC:Lcom/hypixel/hytale/codec/builder/BuilderCodec;
            //   110: 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.visitParameterizedType(TypeSubstitutionVisitor.java:225)
            //     at com.strobel.assembler.metadata.TypeSubstitutionVisitor.visitParameterizedType(TypeSubstitutionVisitor.java:25)
            //     at com.strobel.assembler.metadata.ParameterizedType.accept(ParameterizedType.java:103)
            //     at com.strobel.assembler.metadata.TypeSubstitutionVisitor.visit(TypeSubstitutionVisitor.java:40)
            //     at com.strobel.assembler.metadata.TypeSubstitutionVisitor.visitParameterizedType(TypeSubstitutionVisitor.java:211)
            //     at com.strobel.assembler.metadata.TypeSubstitutionVisitor.visitParameterizedType(TypeSubstitutionVisitor.java:25)
            //     at com.strobel.assembler.metadata.ParameterizedType.accept(ParameterizedType.java:103)
            //     at com.strobel.assembler.metadata.TypeSubstitutionVisitor.visit(TypeSubstitutionVisitor.java:40)
            //     at com.strobel.assembler.metadata.TypeSubstitutionVisitor.visitMethod(TypeSubstitutionVisitor.java:314)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferCall(TypeAnalysis.java:2611)
            //     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: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: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.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.");
        }
    }
    
    // This helper class was generated by Procyon to approximate the behavior of an
    // 'invokedynamic' instruction that it doesn't know how to interpret.
    private static final class ProcyonInvokeDynamicHelper_16
    {
        private static final MethodHandles.Lookup LOOKUP = MethodHandles.lookup();
        private static MethodHandle handle;
        private static volatile int fence;
        
        private static MethodHandle handle() {
            final MethodHandle handle = ProcyonInvokeDynamicHelper_16.handle;
            if (handle != null)
                return handle;
            return ProcyonInvokeDynamicHelper_16.ensureHandle();
        }
        
        private static MethodHandle ensureHandle() {
            ProcyonInvokeDynamicHelper_16.fence = 0;
            MethodHandle handle = ProcyonInvokeDynamicHelper_16.handle;
            if (handle == null) {
                MethodHandles.Lookup lookup = ProcyonInvokeDynamicHelper_16.LOOKUP;
                try {
                    handle = ((CallSite)StringConcatFactory.makeConcatWithConstants(lookup, "makeConcatWithConstants", MethodType.methodType(String.class, String.class, String.class), "\u0001=\u0001")).dynamicInvoker();
                }
                catch (Throwable t) {
                    throw new UndeclaredThrowableException(t);
                }
                ProcyonInvokeDynamicHelper_16.fence = 1;
                ProcyonInvokeDynamicHelper_16.handle = handle;
                ProcyonInvokeDynamicHelper_16.fence = 0;
            }
            return handle;
        }
        
        private static String invoke(String p0, String p1) {
            try {
                return ProcyonInvokeDynamicHelper_16.handle().invokeExact(p0, p1);
            }
            catch (Throwable t) {
                throw new UndeclaredThrowableException(t);
            }
        }
    }
}
