// 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.dom.*;
import net.unit8.moshas.helper.Validate;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
     */
    public static final class AttributeWithValueMatching extends Evaluator {
        final String key;
        final Pattern pattern;

        public AttributeWithValueMatching(String key, Pattern pattern) {
            this.key = key.trim().toLowerCase();
            this.pattern = pattern;
        }

        @Override
        public boolean matches(Element root, Element element) {
            return element.hasAttr(key) && pattern.matcher(element.attr(key)).find();
        }

        @Override
        public String toString() {
            return String.format("[%s~=%s]", key, pattern.toString());
        }

    }

    /**
     * Abstract evaluator for attribute name/value matching
     */
    public abstract static class AttributeKeyPair extends Evaluator {
        final String key;
        final String value;

        public AttributeKeyPair(String key, String value) {
// 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/select/Evaluator.java
import net.unit8.moshas.dom.*;
import net.unit8.moshas.helper.Validate;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

     */
    public static final class AttributeWithValueMatching extends Evaluator {
        final String key;
        final Pattern pattern;

        public AttributeWithValueMatching(String key, Pattern pattern) {
            this.key = key.trim().toLowerCase();
            this.pattern = pattern;
        }

        @Override
        public boolean matches(Element root, Element element) {
            return element.hasAttr(key) && pattern.matcher(element.attr(key)).find();
        }

        @Override
        public String toString() {
            return String.format("[%s~=%s]", key, pattern.toString());
        }

    }

    /**
     * Abstract evaluator for attribute name/value matching
     */
    public abstract static class AttributeKeyPair extends Evaluator {
        final String key;
        final String value;

        public AttributeKeyPair(String key, String value) {
            Validate.notEmpty(key);