// Path: parser/src/main/java/ch/ethz/inf/vs/semantics/parser/visitors/IN3ElementVisitor.java
// public interface IN3ElementVisitor<T> {
// 	public T visitBlankNode(BlankNode blankNode);
// 
// 	T visitBlankNodePropertyList(BlankNodePropertyList verbObjects);
// 
// 	T visitBooleanLiteral(BooleanLiteral booleanLiteral);
// 
// 	T vistClassification(Classification classification);
// 
// 	T vistExvar(Exvar exvar);
// 
// 	T vistFormula(Formula statements);
// 
// 	T visitIri(Iri iri);
// 
// 	T visitLiteral(Literal literal);
// 
// 	T visitObjectCollection(ObjectCollection objects);
// 
// 	T visitObjectList(ObjectList objects);
// 
// 	T visitStatements(Statements statements);
// 
// 	T visitRDFResource(RDFResource RDFResource);
// 
// 	T visitVerb(Verb verb);
// 
// 	T visitVerbObject(VerbObject verbObject);
// 
// 	T visitN3Document(N3Document n3Document);
// 
// 	T visitPrefix(Prefix p);
// }
// 
// Path: parser/src/main/java/ch/ethz/inf/vs/semantics/parser/visitors/ReplacePrefixVisitor.java
// public class ReplacePrefixVisitor extends N3BaseElementVisitor<Void> {
// 
// 	private Prefix original;
// 	private Prefix replace;
// 
// 	public ReplacePrefixVisitor(Prefix original, Prefix replace) {
// 		this.original = original;
// 		this.replace = replace;
// 	}
// 
// 	@Override
// 	public Void visitIri(Iri iri) {
// 		Prefix p = iri.getPrefix();
// 		if (p == original) {
// 			iri.setPrefix(replace);
// 		}
// 		return null;
// 	}
// }
// 
// Path: parser/src/main/java/ch/ethz/inf/vs/semantics/parser/visitors/UsedPrefixesElementVisitor.java
// public class UsedPrefixesElementVisitor extends N3BaseElementVisitor<Set<Prefix>> {
// 	@Override
// 	public Set<Prefix> defaultResult() {
// 		return new HashSet<Prefix>();
// 	}
// 
// 	@Override
// 	public Set<Prefix> aggregateResult(Set<Prefix> result, Set<Prefix> cResult) {
// 		if (cResult != null) {
// 			result.addAll(cResult);
// 		}
// 		return result;
// 	}
// 
// 	@Override
// 	public Set<Prefix> visitIri(Iri iri) {
// 		HashSet<Prefix> list = new HashSet<Prefix>();
// 		Prefix p = iri.getPrefix();
// 		if (p != null) {
// 			list.add(p);
// 		}
// 		return list;
// 	}
// }


import ch.ethz.inf.vs.semantics.parser.visitors.IN3ElementVisitor;
import ch.ethz.inf.vs.semantics.parser.visitors.ReplacePrefixVisitor;
import ch.ethz.inf.vs.semantics.parser.visitors.UsedPrefixesElementVisitor;
import java.io.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Set;
			ByteArrayInputStream bais = new ByteArrayInputStream(byteData);
			return (T) new ObjectInputStream(bais).readObject();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		throw new RuntimeException("Can not copy objects");
	}

	@Override
	public String toString() {
		StringBuilder sb = new StringBuilder();
		for (Prefix prefix : prefixes.values()) {
			sb.append("@prefix ");
			sb.append(prefix.getName());
			sb.append(" <");
			sb.append(prefix.getUri());
			sb.append(">.\n");
		}
		sb.append("\n");
		for (N3Element.Statement s : statements) {
			sb.append(s.toString());
			sb.append(".\n\n");
		}

		return sb.toString();
	}

	@Override
// Path: parser/src/main/java/ch/ethz/inf/vs/semantics/parser/visitors/IN3ElementVisitor.java
// public interface IN3ElementVisitor<T> {
// 	public T visitBlankNode(BlankNode blankNode);
// 
// 	T visitBlankNodePropertyList(BlankNodePropertyList verbObjects);
// 
// 	T visitBooleanLiteral(BooleanLiteral booleanLiteral);
// 
// 	T vistClassification(Classification classification);
// 
// 	T vistExvar(Exvar exvar);
// 
// 	T vistFormula(Formula statements);
// 
// 	T visitIri(Iri iri);
// 
// 	T visitLiteral(Literal literal);
// 
// 	T visitObjectCollection(ObjectCollection objects);
// 
// 	T visitObjectList(ObjectList objects);
// 
// 	T visitStatements(Statements statements);
// 
// 	T visitRDFResource(RDFResource RDFResource);
// 
// 	T visitVerb(Verb verb);
// 
// 	T visitVerbObject(VerbObject verbObject);
// 
// 	T visitN3Document(N3Document n3Document);
// 
// 	T visitPrefix(Prefix p);
// }
// 
// Path: parser/src/main/java/ch/ethz/inf/vs/semantics/parser/visitors/ReplacePrefixVisitor.java
// public class ReplacePrefixVisitor extends N3BaseElementVisitor<Void> {
// 
// 	private Prefix original;
// 	private Prefix replace;
// 
// 	public ReplacePrefixVisitor(Prefix original, Prefix replace) {
// 		this.original = original;
// 		this.replace = replace;
// 	}
// 
// 	@Override
// 	public Void visitIri(Iri iri) {
// 		Prefix p = iri.getPrefix();
// 		if (p == original) {
// 			iri.setPrefix(replace);
// 		}
// 		return null;
// 	}
// }
// 
// Path: parser/src/main/java/ch/ethz/inf/vs/semantics/parser/visitors/UsedPrefixesElementVisitor.java
// public class UsedPrefixesElementVisitor extends N3BaseElementVisitor<Set<Prefix>> {
// 	@Override
// 	public Set<Prefix> defaultResult() {
// 		return new HashSet<Prefix>();
// 	}
// 
// 	@Override
// 	public Set<Prefix> aggregateResult(Set<Prefix> result, Set<Prefix> cResult) {
// 		if (cResult != null) {
// 			result.addAll(cResult);
// 		}
// 		return result;
// 	}
// 
// 	@Override
// 	public Set<Prefix> visitIri(Iri iri) {
// 		HashSet<Prefix> list = new HashSet<Prefix>();
// 		Prefix p = iri.getPrefix();
// 		if (p != null) {
// 			list.add(p);
// 		}
// 		return list;
// 	}
// }


// Path: parser/src/main/java/ch/ethz/inf/vs/semantics/parser/elements/N3Document.java
import ch.ethz.inf.vs.semantics.parser.visitors.IN3ElementVisitor;
import ch.ethz.inf.vs.semantics.parser.visitors.ReplacePrefixVisitor;
import ch.ethz.inf.vs.semantics.parser.visitors.UsedPrefixesElementVisitor;
import java.io.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Set;

			ByteArrayInputStream bais = new ByteArrayInputStream(byteData);
			return (T) new ObjectInputStream(bais).readObject();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		throw new RuntimeException("Can not copy objects");
	}

	@Override
	public String toString() {
		StringBuilder sb = new StringBuilder();
		for (Prefix prefix : prefixes.values()) {
			sb.append("@prefix ");
			sb.append(prefix.getName());
			sb.append(" <");
			sb.append(prefix.getUri());
			sb.append(">.\n");
		}
		sb.append("\n");
		for (N3Element.Statement s : statements) {
			sb.append(s.toString());
			sb.append(".\n\n");
		}

		return sb.toString();
	}

	@Override
	public <T> T accept(IN3ElementVisitor<T> b) {