// Path: src/main/java/wdl/range/IRangeGroupType.java
// public interface IRangeGroupType<T extends IRangeProducer> {
// 	/**
// 	 * Validates that the given {@link ConfigurationSection} is acceptable.
// 	 * 
// 	 * @param config
// 	 *            The config to check.
// 	 * @param warnings
// 	 *            A list to put warnings into if if any occur.
// 	 * @param errors
// 	 *            A list to put errors into if if any occur.
// 	 * @return <code>false</code> if the configuration is fatally unacceptable
// 	 *         to the point where this {@link IRangeProducer} should not
// 	 *         use it.  Note that other {@link ConfigurationSection}s may still
// 	 *         be used with this {@link IRangeProducer}.
// 	 */
// 	public abstract boolean isValidConfig(ConfigurationSection config,
// 			List<String> warnings, List<String> errors);
// 	
// 	/**
// 	 * Creates a new {@link IRangeProducer} from the given configuration
// 	 * section. Will only be called if
// 	 * {@link #isValidConfig(ConfigurationSection, List, List)} returned true.
// 	 * 
// 	 * @param config
// 	 *            The config to check.
// 	 */
// 	public abstract T createRangeProducer(
// 			IRangeGroup group, ConfigurationSection config);
// 	
// 	/**
// 	 * Disposes of this {@link IRangeGroupType}.  Events should be unregistered,
// 	 * etc.  Note that this should NOT dispose any created {@link IRangeProducer}s;
// 	 * they will be handled manually.
// 	 * 
// 	 * After this method has been called, this {@link IRangeGroupType} instance
// 	 * will no longer be used.  In most cases, a new instance will be created
// 	 * (potentially with a different configuration).
// 	 * 
// 	 * Note: To unregister all events in a {@link Listener}, you can call
// 	 * {@link HandlerList#unregisterAll(Listener)}.
// 	 */
// 	public abstract void dispose();
// }


import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Set;
import org.bukkit.Bukkit;
import org.bukkit.command.CommandSender;
import org.bukkit.configuration.Configuration;
import org.bukkit.configuration.ConfigurationSection;
import wdl.range.IRangeGroupType;

		}
	}
	
	/**
	 * Validates the given chunk override.
	 * 
	 * @param override The {@link ConfigurationSection} for the chunk override.
	 * @param key ID of the override
	 * @param warnTo The player to complain to if something is wrong.
	 * @param plugin The instance of the plugin.
	 * @return True if the override is valid, false otherwise.
	 */
	private static boolean validateChunkOverride(ConfigurationSection override,
			String key, CommandSender warnTo, WDLCompanion plugin) {
		if (!override.isString("type")) {
			 warnTo.sendMessage("§c[WDL] ERROR: 'type' for chunk " 
					+ "override '" + key + "' is not set or not a "
					+ "string!  It will be ignored.");
			 return false;
		}
		String typeName = override.getString("type");
		if (!plugin.registeredRangeGroupTypes.containsKey(typeName)) {
			 warnTo.sendMessage("§c[WDL] ERROR: 'type' for chunk " 
						+ "override '" + key + "' is not a valid option!  "
						+ "Currently '" + typeName + "', expected one of "
						+ plugin.registeredRangeGroupTypes.keySet() + ".  " 
						+ "It will be ignored.");
			 return false;
		}
		

// Path: src/main/java/wdl/range/IRangeGroupType.java
// public interface IRangeGroupType<T extends IRangeProducer> {
// 	/**
// 	 * Validates that the given {@link ConfigurationSection} is acceptable.
// 	 * 
// 	 * @param config
// 	 *            The config to check.
// 	 * @param warnings
// 	 *            A list to put warnings into if if any occur.
// 	 * @param errors
// 	 *            A list to put errors into if if any occur.
// 	 * @return <code>false</code> if the configuration is fatally unacceptable
// 	 *         to the point where this {@link IRangeProducer} should not
// 	 *         use it.  Note that other {@link ConfigurationSection}s may still
// 	 *         be used with this {@link IRangeProducer}.
// 	 */
// 	public abstract boolean isValidConfig(ConfigurationSection config,
// 			List<String> warnings, List<String> errors);
// 	
// 	/**
// 	 * Creates a new {@link IRangeProducer} from the given configuration
// 	 * section. Will only be called if
// 	 * {@link #isValidConfig(ConfigurationSection, List, List)} returned true.
// 	 * 
// 	 * @param config
// 	 *            The config to check.
// 	 */
// 	public abstract T createRangeProducer(
// 			IRangeGroup group, ConfigurationSection config);
// 	
// 	/**
// 	 * Disposes of this {@link IRangeGroupType}.  Events should be unregistered,
// 	 * etc.  Note that this should NOT dispose any created {@link IRangeProducer}s;
// 	 * they will be handled manually.
// 	 * 
// 	 * After this method has been called, this {@link IRangeGroupType} instance
// 	 * will no longer be used.  In most cases, a new instance will be created
// 	 * (potentially with a different configuration).
// 	 * 
// 	 * Note: To unregister all events in a {@link Listener}, you can call
// 	 * {@link HandlerList#unregisterAll(Listener)}.
// 	 */
// 	public abstract void dispose();
// }


// Path: src/main/java/wdl/ConfigValidation.java
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Set;
import org.bukkit.Bukkit;
import org.bukkit.command.CommandSender;
import org.bukkit.configuration.Configuration;
import org.bukkit.configuration.ConfigurationSection;
import wdl.range.IRangeGroupType;

		}
	}
	
	/**
	 * Validates the given chunk override.
	 * 
	 * @param override The {@link ConfigurationSection} for the chunk override.
	 * @param key ID of the override
	 * @param warnTo The player to complain to if something is wrong.
	 * @param plugin The instance of the plugin.
	 * @return True if the override is valid, false otherwise.
	 */
	private static boolean validateChunkOverride(ConfigurationSection override,
			String key, CommandSender warnTo, WDLCompanion plugin) {
		if (!override.isString("type")) {
			 warnTo.sendMessage("§c[WDL] ERROR: 'type' for chunk " 
					+ "override '" + key + "' is not set or not a "
					+ "string!  It will be ignored.");
			 return false;
		}
		String typeName = override.getString("type");
		if (!plugin.registeredRangeGroupTypes.containsKey(typeName)) {
			 warnTo.sendMessage("§c[WDL] ERROR: 'type' for chunk " 
						+ "override '" + key + "' is not a valid option!  "
						+ "Currently '" + typeName + "', expected one of "
						+ plugin.registeredRangeGroupTypes.keySet() + ".  " 
						+ "It will be ignored.");
			 return false;
		}
		

		IRangeGroupType<?> type = plugin.registeredRangeGroupTypes.get(typeName);
