// Path: src/main/java/eureka/api/BasicEurekaCategory.java
// public class BasicEurekaCategory implements ICategory {
// 	private final String name;
// 	private final ItemStack displayStack;
// 
// 	public BasicEurekaCategory(String name, ItemStack displayStack) {
// 		this.name = name;
// 		this.displayStack = displayStack;
// 	}
// 
// 	public BasicEurekaCategory(String name, Block block) {
// 		this(name, new ItemStack(block));
// 	}
// 
// 	public BasicEurekaCategory(String name, Item item) {
// 		this(name, new ItemStack(item));
// 	}
// 
// 	@Override
// 	public String getName() {
// 		return name;
// 	}
// 
// 	@Override
// 	public ItemStack getDisplayStack() {
// 		return displayStack;
// 	}
// }
// 
// Path: src/main/java/eureka/api/BasicEurekaInfo.java
// public class BasicEurekaInfo implements IEurekaInfo {
// 	private final String category, name;
// 	private final int maxProgress;
// 	private final ItemStack displayStack;
// 	private final List<String> requiredResearch;
// 
// 	public BasicEurekaInfo(String name, String category, int maxProgress, ItemStack displayStack, String... requiredResearch) {
// 		this.name = name;
// 		this.category = category;
// 		this.maxProgress = maxProgress;
// 		this.displayStack = displayStack;
// 		List<String> research = new ArrayList<String>();
// 		research.addAll(Arrays.asList(requiredResearch));
// 		this.requiredResearch = research;
// 	}
// 
// 	public BasicEurekaInfo(String name, String category, int maxProgress, Item item, String... requiredResearch) {
// 		this(name, category, maxProgress, new ItemStack(item), requiredResearch);
// 	}
// 
// 	public BasicEurekaInfo(String name, String category, int maxProgress, Block block, String... requiredResearch) {
// 		this(name, category, maxProgress, new ItemStack(block), requiredResearch);
// 	}
// 
// 	@Override
// 	public String getCategory() {
// 		return category;
// 	}
// 
// 	@Override
// 	public int getMaxProgress() {
// 		return maxProgress;
// 	}
// 
// 	@Override
// 	public ItemStack getDisplayStack() {
// 		return displayStack;
// 	}
// 
// 	@Override
// 	public String getName() {
// 		return name;
// 	}
// 
// 	@Override
// 	public List<String> getRequiredResearch() {
// 		return requiredResearch;
// 	}
// }
// 
// Path: src/main/java/eureka/api/EurekaAPI.java
// public class EurekaAPI {
// 
// 	public static IEurekAPI API;
// }
// 
// Path: src/main/java/eureka/core/Logger.java
// public class Logger {
// 
// 	public static final org.apache.logging.log4j.Logger logger = LogManager.getLogger("Eureka");
// 
// 	public static void info(String message) {
// 		logger.info(message);
// 	}
// 
// 	public static void error(String message) {
// 		logger.error(message);
// 	}
// }


import java.io.File;
import java.io.FileReader;
import java.io.FilenameFilter;
import java.nio.file.Files;
import java.util.ArrayList;
import java.util.List;
import com.google.common.base.Strings;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import net.minecraft.item.ItemBlock;
import net.minecraft.item.ItemStack;
import cpw.mods.fml.common.registry.GameRegistry;
import eureka.api.BasicEurekaCategory;
import eureka.api.BasicEurekaInfo;
import eureka.api.EurekaAPI;
import eureka.core.Logger;
		})) {
			readCategory(file);
		}
		if (!keyFolder.exists())
			return;
		for (File file : keyFolder.listFiles(new FilenameFilter() {
			@Override
			public boolean accept(File dir, String name) {
				return name.endsWith(".json");
			}
		})) {
			readKey(file);
		}
	}

	private static void readCategory(File file) {
		try {
			JSONCategory category = gson.fromJson(new FileReader(file), JSONCategory.class);
			EurekaAPI.API.registerCategory(new BasicEurekaCategory(category.name, getStack(category.displayStack)));
		} catch (Throwable t) {
			Logger.error("Failed to read category file (" + file.getName() + ")");
		}
	}

	private static void readKey(File file) {
		try {
			JSONChapter chapter = gson.fromJson(new FileReader(file), JSONChapter.class);
			List<ItemStack> objects = new ArrayList<ItemStack>();
			for (String stack : chapter.blockedObjects)
				objects.add(getStack(stack));
// Path: src/main/java/eureka/api/BasicEurekaCategory.java
// public class BasicEurekaCategory implements ICategory {
// 	private final String name;
// 	private final ItemStack displayStack;
// 
// 	public BasicEurekaCategory(String name, ItemStack displayStack) {
// 		this.name = name;
// 		this.displayStack = displayStack;
// 	}
// 
// 	public BasicEurekaCategory(String name, Block block) {
// 		this(name, new ItemStack(block));
// 	}
// 
// 	public BasicEurekaCategory(String name, Item item) {
// 		this(name, new ItemStack(item));
// 	}
// 
// 	@Override
// 	public String getName() {
// 		return name;
// 	}
// 
// 	@Override
// 	public ItemStack getDisplayStack() {
// 		return displayStack;
// 	}
// }
// 
// Path: src/main/java/eureka/api/BasicEurekaInfo.java
// public class BasicEurekaInfo implements IEurekaInfo {
// 	private final String category, name;
// 	private final int maxProgress;
// 	private final ItemStack displayStack;
// 	private final List<String> requiredResearch;
// 
// 	public BasicEurekaInfo(String name, String category, int maxProgress, ItemStack displayStack, String... requiredResearch) {
// 		this.name = name;
// 		this.category = category;
// 		this.maxProgress = maxProgress;
// 		this.displayStack = displayStack;
// 		List<String> research = new ArrayList<String>();
// 		research.addAll(Arrays.asList(requiredResearch));
// 		this.requiredResearch = research;
// 	}
// 
// 	public BasicEurekaInfo(String name, String category, int maxProgress, Item item, String... requiredResearch) {
// 		this(name, category, maxProgress, new ItemStack(item), requiredResearch);
// 	}
// 
// 	public BasicEurekaInfo(String name, String category, int maxProgress, Block block, String... requiredResearch) {
// 		this(name, category, maxProgress, new ItemStack(block), requiredResearch);
// 	}
// 
// 	@Override
// 	public String getCategory() {
// 		return category;
// 	}
// 
// 	@Override
// 	public int getMaxProgress() {
// 		return maxProgress;
// 	}
// 
// 	@Override
// 	public ItemStack getDisplayStack() {
// 		return displayStack;
// 	}
// 
// 	@Override
// 	public String getName() {
// 		return name;
// 	}
// 
// 	@Override
// 	public List<String> getRequiredResearch() {
// 		return requiredResearch;
// 	}
// }
// 
// Path: src/main/java/eureka/api/EurekaAPI.java
// public class EurekaAPI {
// 
// 	public static IEurekAPI API;
// }
// 
// Path: src/main/java/eureka/core/Logger.java
// public class Logger {
// 
// 	public static final org.apache.logging.log4j.Logger logger = LogManager.getLogger("Eureka");
// 
// 	public static void info(String message) {
// 		logger.info(message);
// 	}
// 
// 	public static void error(String message) {
// 		logger.error(message);
// 	}
// }


// Path: src/main/java/eureka/json/ConfigReader.java
import java.io.File;
import java.io.FileReader;
import java.io.FilenameFilter;
import java.nio.file.Files;
import java.util.ArrayList;
import java.util.List;
import com.google.common.base.Strings;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import net.minecraft.item.ItemBlock;
import net.minecraft.item.ItemStack;
import cpw.mods.fml.common.registry.GameRegistry;
import eureka.api.BasicEurekaCategory;
import eureka.api.BasicEurekaInfo;
import eureka.api.EurekaAPI;
import eureka.core.Logger;

		})) {
			readCategory(file);
		}
		if (!keyFolder.exists())
			return;
		for (File file : keyFolder.listFiles(new FilenameFilter() {
			@Override
			public boolean accept(File dir, String name) {
				return name.endsWith(".json");
			}
		})) {
			readKey(file);
		}
	}

	private static void readCategory(File file) {
		try {
			JSONCategory category = gson.fromJson(new FileReader(file), JSONCategory.class);
			EurekaAPI.API.registerCategory(new BasicEurekaCategory(category.name, getStack(category.displayStack)));
		} catch (Throwable t) {
			Logger.error("Failed to read category file (" + file.getName() + ")");
		}
	}

	private static void readKey(File file) {
		try {
			JSONChapter chapter = gson.fromJson(new FileReader(file), JSONChapter.class);
			List<ItemStack> objects = new ArrayList<ItemStack>();
			for (String stack : chapter.blockedObjects)
				objects.add(getStack(stack));
			EurekaAPI.API.register(new BasicEurekaInfo(chapter.name, chapter.category, chapter.maxProgress, getStack(chapter.displayStack), chapter.requiredResearch.toArray(new String[100])));