// Path: core/src/main/java/org/aimlang/core/bot/BotInfo.java
// public interface BotInfo {
// 
//     String getFirstname();
// 
//     String getLastname();
// 
//     String getLanguage();
// 
//     String getEmail();
// 
//     String getGender();
// 
//     String getVersion();
// 
//     String getBirthplace();
// 
//     String getJob();
// 
//     String getSpecies();
// 
//     String getBirthday();
// 
//     String getBirthdate();
// 
//     String getSign();
// 
//     String getReligion();
// 
//     String getBotmaster();
// 
//     String getValue(String param);
// }
// 
// Path: core/src/main/java/org/aimlang/core/entity/AimlCategory.java
// public class AimlCategory implements AimlElement {
//     private String topic = "";
//     private String pattern = "";
//     private Node template = null;
//     private List<AimlToken> templateData = new ArrayList<>();
//     private String that = "";
// 
//     @Override
//     public String getType() {
//         return AimlTag.category;
//     }
// 
//     public String getTopic() {
//         return topic;
//     }
// 
//     public String getPattern() {
//         return pattern;
//     }
// 
//     public Node getTemplate() {
//         return template;
//     }
// 
//     public List<AimlToken> getTemplateData() {
//         return templateData;
//     }
// 
//     public String getThat() {
//         return that;
//     }
// 
//     public void setTopic(String topic) {
//         this.topic = topic;
//     }
// 
//     public void setPattern(String pattern) {
//         this.pattern = pattern;
//     }
// 
//     public void setTemplate(Node template) {
//         this.template = template;
//     }
// 
//     public void setTemplateData(List<AimlToken> templateData) {
//         this.templateData = templateData;
//     }
// 
//     public void setThat(String that) {
//         this.that = that;
//     }
// 
//     public boolean equals(Object o) {
//         if (o == this) {
//             return true;
//         } else if (!(o instanceof AimlCategory)) {
//             return false;
//         } else {
//             AimlCategory other = (AimlCategory) o;
//             return Objects.equals(topic, other.getTopic())
//                     && Objects.equals(pattern, other.getPattern())
//                     && Objects.equals(template, other.getTemplate())
//                     && Objects.equals(that, other.getThat());
//         }
//     }
// 
//     @Override
//     public AimlCategory clone() {
//         AimlCategory category = new AimlCategory();
//         category.setTopic(topic);
//         category.setPattern(pattern);
//         category.setTemplate(template);
//         category.setTemplateData(templateData);
//         category.setThat(that);
//         return category;
//     }
// 
//     public int hashCode() {
//         int result = 1;
//         result = 31 * result + (topic == null ? 0 : topic.hashCode());
//         result = 31 * result + (pattern == null ? 0 : pattern.hashCode());
//         result = 31 * result + (template == null ? 0 : template.hashCode());
//         result = 31 * result + (that == null ? 0 : that.hashCode());
//         return result;
//     }
// 
//     public String toString() {
//         return "AimlCategory(topic=" + topic + ", pattern=" + pattern + ", template=" + template + ", that=" + that + ")";
//     }
// }
// 
// Path: core/src/main/java/org/aimlang/core/entity/AimlMap.java
// public class AimlMap extends HashMap<String, String> implements Named, AimlElement {
//     protected final String name;
// 
//     public AimlMap(String name, Map<String, String> data) {
//         super(data);
//         this.name = name;
//     }
// 
//     @Override
//     public String getName() {
//         return name;
//     }
// 
//     @Override
//     public String getType() {
//         return map;
//     }
// }
// 
// Path: core/src/main/java/org/aimlang/core/entity/AimlSet.java
// public class AimlSet extends HashSet<String> implements Named, AimlElement {
//     private final String name;
// 
//     public AimlSet(String name, Set<String> data) {
//         super(data);
//         this.name = name;
//     }
// 
//     @Override
//     public String getName() {
//         return name;
//     }
// 
//     @Override
//     public String getType() {
//         return AimlTag.set;
//     }
// }
// 
// Path: core/src/main/java/org/aimlang/core/entity/AimlSubstitution.java
// public class AimlSubstitution extends AimlMap {
// 
//     public AimlSubstitution(String name, Map<String, String> data) {
//         super(name, data);
//     }
// }


import org.aimlang.core.bot.BotInfo;
import org.aimlang.core.entity.AimlCategory;
import org.aimlang.core.entity.AimlMap;
import org.aimlang.core.entity.AimlSet;
import org.aimlang.core.entity.AimlSubstitution;
import java.util.List;
import java.util.Map;
package org.aimlang.core.core;



/**
 * The AIML Pattern matching algorithm and data structure.
 * Brain of bot.
 *
 * @author anton
 * @author Marco
 *         Predicates are passed to AIMLProcessor
 */
public class GraphMaster {
    private final Map<String, AimlSet> sets;
// Path: core/src/main/java/org/aimlang/core/bot/BotInfo.java
// public interface BotInfo {
// 
//     String getFirstname();
// 
//     String getLastname();
// 
//     String getLanguage();
// 
//     String getEmail();
// 
//     String getGender();
// 
//     String getVersion();
// 
//     String getBirthplace();
// 
//     String getJob();
// 
//     String getSpecies();
// 
//     String getBirthday();
// 
//     String getBirthdate();
// 
//     String getSign();
// 
//     String getReligion();
// 
//     String getBotmaster();
// 
//     String getValue(String param);
// }
// 
// Path: core/src/main/java/org/aimlang/core/entity/AimlCategory.java
// public class AimlCategory implements AimlElement {
//     private String topic = "";
//     private String pattern = "";
//     private Node template = null;
//     private List<AimlToken> templateData = new ArrayList<>();
//     private String that = "";
// 
//     @Override
//     public String getType() {
//         return AimlTag.category;
//     }
// 
//     public String getTopic() {
//         return topic;
//     }
// 
//     public String getPattern() {
//         return pattern;
//     }
// 
//     public Node getTemplate() {
//         return template;
//     }
// 
//     public List<AimlToken> getTemplateData() {
//         return templateData;
//     }
// 
//     public String getThat() {
//         return that;
//     }
// 
//     public void setTopic(String topic) {
//         this.topic = topic;
//     }
// 
//     public void setPattern(String pattern) {
//         this.pattern = pattern;
//     }
// 
//     public void setTemplate(Node template) {
//         this.template = template;
//     }
// 
//     public void setTemplateData(List<AimlToken> templateData) {
//         this.templateData = templateData;
//     }
// 
//     public void setThat(String that) {
//         this.that = that;
//     }
// 
//     public boolean equals(Object o) {
//         if (o == this) {
//             return true;
//         } else if (!(o instanceof AimlCategory)) {
//             return false;
//         } else {
//             AimlCategory other = (AimlCategory) o;
//             return Objects.equals(topic, other.getTopic())
//                     && Objects.equals(pattern, other.getPattern())
//                     && Objects.equals(template, other.getTemplate())
//                     && Objects.equals(that, other.getThat());
//         }
//     }
// 
//     @Override
//     public AimlCategory clone() {
//         AimlCategory category = new AimlCategory();
//         category.setTopic(topic);
//         category.setPattern(pattern);
//         category.setTemplate(template);
//         category.setTemplateData(templateData);
//         category.setThat(that);
//         return category;
//     }
// 
//     public int hashCode() {
//         int result = 1;
//         result = 31 * result + (topic == null ? 0 : topic.hashCode());
//         result = 31 * result + (pattern == null ? 0 : pattern.hashCode());
//         result = 31 * result + (template == null ? 0 : template.hashCode());
//         result = 31 * result + (that == null ? 0 : that.hashCode());
//         return result;
//     }
// 
//     public String toString() {
//         return "AimlCategory(topic=" + topic + ", pattern=" + pattern + ", template=" + template + ", that=" + that + ")";
//     }
// }
// 
// Path: core/src/main/java/org/aimlang/core/entity/AimlMap.java
// public class AimlMap extends HashMap<String, String> implements Named, AimlElement {
//     protected final String name;
// 
//     public AimlMap(String name, Map<String, String> data) {
//         super(data);
//         this.name = name;
//     }
// 
//     @Override
//     public String getName() {
//         return name;
//     }
// 
//     @Override
//     public String getType() {
//         return map;
//     }
// }
// 
// Path: core/src/main/java/org/aimlang/core/entity/AimlSet.java
// public class AimlSet extends HashSet<String> implements Named, AimlElement {
//     private final String name;
// 
//     public AimlSet(String name, Set<String> data) {
//         super(data);
//         this.name = name;
//     }
// 
//     @Override
//     public String getName() {
//         return name;
//     }
// 
//     @Override
//     public String getType() {
//         return AimlTag.set;
//     }
// }
// 
// Path: core/src/main/java/org/aimlang/core/entity/AimlSubstitution.java
// public class AimlSubstitution extends AimlMap {
// 
//     public AimlSubstitution(String name, Map<String, String> data) {
//         super(name, data);
//     }
// }


// Path: core/src/main/java/org/aimlang/core/core/GraphMaster.java
import org.aimlang.core.bot.BotInfo;
import org.aimlang.core.entity.AimlCategory;
import org.aimlang.core.entity.AimlMap;
import org.aimlang.core.entity.AimlSet;
import org.aimlang.core.entity.AimlSubstitution;
import java.util.List;
import java.util.Map;

package org.aimlang.core.core;



/**
 * The AIML Pattern matching algorithm and data structure.
 * Brain of bot.
 *
 * @author anton
 * @author Marco
 *         Predicates are passed to AIMLProcessor
 */
public class GraphMaster {
    private final Map<String, AimlSet> sets;
    private final Map<String, AimlMap> maps;