// Path: moshas/src/main/java/net/unit8/moshas/helper/Validate.java
// public class Validate {
//     
//     private Validate() {}
// 
//     /**
//      * Validates that the object is not null
//      * @param obj object to test
//      */
//     public static void notNull(Object obj) {
//         if (obj == null)
//             throw new IllegalArgumentException("Object must not be null");
//     }
// 
//     /**
//      * Validates that the object is not null
//      * @param obj object to test
//      * @param msg message to output if validation fails
//      */
//     public static void notNull(Object obj, String msg) {
//         if (obj == null)
//             throw new IllegalArgumentException(msg);
//     }
// 
//     /**
//      * Validates that the value is true
//      * @param val object to test
//      */
//     public static void isTrue(boolean val) {
//         if (!val)
//             throw new IllegalArgumentException("Must be true");
//     }
// 
//     /**
//      * Validates that the value is true
//      * @param val object to test
//      * @param msg message to output if validation fails
//      */
//     public static void isTrue(boolean val, String msg) {
//         if (!val)
//             throw new IllegalArgumentException(msg);
//     }
// 
//     /**
//      * Validates that the value is false
//      * @param val object to test
//      */
//     public static void isFalse(boolean val) {
//         if (val)
//             throw new IllegalArgumentException("Must be false");
//     }
// 
//     /**
//      * Validates that the value is false
//      * @param val object to test
//      * @param msg message to output if validation fails
//      */
//     public static void isFalse(boolean val, String msg) {
//         if (val)
//             throw new IllegalArgumentException(msg);
//     }
// 
//     /**
//      * Validates that the array contains no null elements
//      * @param objects the array to test
//      */
//     public static void noNullElements(Object[] objects) {
//         noNullElements(objects, "Array must not contain any null objects");
//     }
// 
//     /**
//      * Validates that the array contains no null elements
//      * @param objects the array to test
//      * @param msg message to output if validation fails
//      */
//     public static void noNullElements(Object[] objects, String msg) {
//         for (Object obj : objects)
//             if (obj == null)
//                 throw new IllegalArgumentException(msg);
//     }
// 
//     /**
//      * Validates that the string is not empty
//      * @param string the string to test
//      */
//     public static void notEmpty(String string) {
//         if (string == null || string.length() == 0)
//             throw new IllegalArgumentException("String must not be empty");
//     }
// 
//     /**
//      * Validates that the string is not empty
//      * @param string the string to test
//      * @param msg message to output if validation fails
//      */
//     public static void notEmpty(String string, String msg) {
//         if (string == null || string.length() == 0)
//             throw new IllegalArgumentException(msg);
//     }
// 
//     /**
//      Cause a failure.
//      @param msg message to output.
//      */
//     public static void fail(String msg) {
//         throw new IllegalArgumentException(msg);
//     }    
// }


import net.unit8.moshas.helper.Validate;
import java.util.Arrays;
import java.util.Locale;
package net.unit8.moshas.parser;



/**
 *
 * @author kawasima
 */
class CharacterReader {
    static final char EOF = (char) -1;
    private static final int maxCacheLen = 12;

    private final char[] input;
    private final int length;
    private int pos = 0;
    private int mark = 0;
    private final String[] stringCache = new String[512]; // holds reused strings in this doc, to lessen garbage

    CharacterReader(String input) {
// Path: moshas/src/main/java/net/unit8/moshas/helper/Validate.java
// public class Validate {
//     
//     private Validate() {}
// 
//     /**
//      * Validates that the object is not null
//      * @param obj object to test
//      */
//     public static void notNull(Object obj) {
//         if (obj == null)
//             throw new IllegalArgumentException("Object must not be null");
//     }
// 
//     /**
//      * Validates that the object is not null
//      * @param obj object to test
//      * @param msg message to output if validation fails
//      */
//     public static void notNull(Object obj, String msg) {
//         if (obj == null)
//             throw new IllegalArgumentException(msg);
//     }
// 
//     /**
//      * Validates that the value is true
//      * @param val object to test
//      */
//     public static void isTrue(boolean val) {
//         if (!val)
//             throw new IllegalArgumentException("Must be true");
//     }
// 
//     /**
//      * Validates that the value is true
//      * @param val object to test
//      * @param msg message to output if validation fails
//      */
//     public static void isTrue(boolean val, String msg) {
//         if (!val)
//             throw new IllegalArgumentException(msg);
//     }
// 
//     /**
//      * Validates that the value is false
//      * @param val object to test
//      */
//     public static void isFalse(boolean val) {
//         if (val)
//             throw new IllegalArgumentException("Must be false");
//     }
// 
//     /**
//      * Validates that the value is false
//      * @param val object to test
//      * @param msg message to output if validation fails
//      */
//     public static void isFalse(boolean val, String msg) {
//         if (val)
//             throw new IllegalArgumentException(msg);
//     }
// 
//     /**
//      * Validates that the array contains no null elements
//      * @param objects the array to test
//      */
//     public static void noNullElements(Object[] objects) {
//         noNullElements(objects, "Array must not contain any null objects");
//     }
// 
//     /**
//      * Validates that the array contains no null elements
//      * @param objects the array to test
//      * @param msg message to output if validation fails
//      */
//     public static void noNullElements(Object[] objects, String msg) {
//         for (Object obj : objects)
//             if (obj == null)
//                 throw new IllegalArgumentException(msg);
//     }
// 
//     /**
//      * Validates that the string is not empty
//      * @param string the string to test
//      */
//     public static void notEmpty(String string) {
//         if (string == null || string.length() == 0)
//             throw new IllegalArgumentException("String must not be empty");
//     }
// 
//     /**
//      * Validates that the string is not empty
//      * @param string the string to test
//      * @param msg message to output if validation fails
//      */
//     public static void notEmpty(String string, String msg) {
//         if (string == null || string.length() == 0)
//             throw new IllegalArgumentException(msg);
//     }
// 
//     /**
//      Cause a failure.
//      @param msg message to output.
//      */
//     public static void fail(String msg) {
//         throw new IllegalArgumentException(msg);
//     }    
// }


// Path: moshas/src/main/java/net/unit8/moshas/parser/CharacterReader.java
import net.unit8.moshas.helper.Validate;
import java.util.Arrays;
import java.util.Locale;

package net.unit8.moshas.parser;



/**
 *
 * @author kawasima
 */
class CharacterReader {
    static final char EOF = (char) -1;
    private static final int maxCacheLen = 12;

    private final char[] input;
    private final int length;
    private int pos = 0;
    private int mark = 0;
    private final String[] stringCache = new String[512]; // holds reused strings in this doc, to lessen garbage

    CharacterReader(String input) {
        Validate.notNull(input);