// This file is automatically generated by DemeterJ.

EqualVisitor {
  {{
    private java.util.Stack history = new java.util.Stack();
    public EqualVisitor(Object obj) {
      history.push(obj);
    }
  }}

  before Main {{
    Object obj = history.peek();
    is_equal = is_equal && obj.getClass().equals(host.getClass());
    if(!is_equal) return;
    Object temp1 = host.get_s();
    Object temp2 = ((Main) obj).get_s();
    if(temp1 == null && temp2 == null) {}
    else if(temp1 == null ||
            temp2 == null ||
            !temp1.equals(temp2)) { is_equal = false; return; }
  }}

  before -> BusRoute, buses, Bus_List {{
    if (is_equal) {
      BusRoute obj = (BusRoute) history.peek();
      Object temp5 = obj.get_buses();
      if(temp5==null) { is_equal = false; return; }
      history.push(temp5);
    }
  }}
  after -> BusRoute, buses, Bus_List {{
    if (is_equal) history.pop();
  }}

  before -> BusRoute, towns, Town_List {{
    if (is_equal) {
      BusRoute obj = (BusRoute) history.peek();
      Object temp6 = obj.get_towns();
      if(temp6==null) { is_equal = false; return; }
      history.push(temp6);
    }
  }}
  after -> BusRoute, towns, Town_List {{
    if (is_equal) history.pop();
  }}

  before BusRoute {{
    Object obj = history.peek();
    is_equal = is_equal && obj.getClass().equals(host.getClass());
    if(!is_equal) return;
    Object temp3 = host.get_name();
    Object temp4 = ((BusRoute) obj).get_name();
    if(temp3 == null && temp4 == null) {}
    else if(temp3 == null ||
            temp4 == null ||
            !temp3.equals(temp4)) { is_equal = false; return; }
  }}

  before -> Bus, passengers, Person_List {{
    if (is_equal) {
      Bus obj = (Bus) history.peek();
      Object temp9 = obj.get_passengers();
      if(temp9==null) { is_equal = false; return; }
      history.push(temp9);
    }
  }}
  after -> Bus, passengers, Person_List {{
    if (is_equal) history.pop();
  }}

  before Bus {{
    Object obj = history.peek();
    is_equal = is_equal && obj.getClass().equals(host.getClass());
    if(!is_equal) return;
    Object temp7 = host.get_name();
    Object temp8 = ((Bus) obj).get_name();
    if(temp7 == null && temp8 == null) {}
    else if(temp7 == null ||
            temp8 == null ||
            !temp7.equals(temp8)) { is_equal = false; return; }
  }}

  before -> Town, busStops, BusStop_List {{
    if (is_equal) {
      Town obj = (Town) history.peek();
      Object temp12 = obj.get_busStops();
      if(temp12==null) { is_equal = false; return; }
      history.push(temp12);
    }
  }}
  after -> Town, busStops, BusStop_List {{
    if (is_equal) history.pop();
  }}

  before Town {{
    Object obj = history.peek();
    is_equal = is_equal && obj.getClass().equals(host.getClass());
    if(!is_equal) return;
    Object temp10 = host.get_name();
    Object temp11 = ((Town) obj).get_name();
    if(temp10 == null && temp11 == null) {}
    else if(temp10 == null ||
            temp11 == null ||
            !temp10.equals(temp11)) { is_equal = false; return; }
  }}

  before Person {{
    Object obj = history.peek();
    is_equal = is_equal && obj.getClass().equals(host.getClass());
    if(!is_equal) return;
    Object temp13 = host.get_name();
    Object temp14 = ((Person) obj).get_name();
    if(temp13 == null && temp14 == null) {}
    else if(temp13 == null ||
            temp14 == null ||
            !temp13.equals(temp14)) { is_equal = false; return; }
  }}

  before -> BusStop, waiting, Person_List {{
    if (is_equal) {
      BusStop obj = (BusStop) history.peek();
      Object temp17 = obj.get_waiting();
      if(temp17==null) { is_equal = false; return; }
      history.push(temp17);
    }
  }}
  after -> BusStop, waiting, Person_List {{
    if (is_equal) history.pop();
  }}

  before BusStop {{
    Object obj = history.peek();
    is_equal = is_equal && obj.getClass().equals(host.getClass());
    if(!is_equal) return;
    Object temp15 = host.get_name();
    Object temp16 = ((BusStop) obj).get_name();
    if(temp15 == null && temp16 == null) {}
    else if(temp15 == null ||
            temp16 == null ||
            !temp15.equals(temp16)) { is_equal = false; return; }
  }}

  before PrintVisitor {{
    Object obj = history.peek();
    is_equal = is_equal && obj.getClass().equals(host.getClass());
    if(!is_equal) return;
    is_equal = is_equal && host.get_indent() == ((PrintVisitor) obj).get_indent();
    is_equal = is_equal && host.get_needSpace() == ((PrintVisitor) obj).get_needSpace();
  }}

  before CopyVisitor {{
    Object obj = history.peek();
    is_equal = is_equal && obj.getClass().equals(host.getClass());
    if(!is_equal) return;
    Object temp18 = host.get_copy();
    Object temp19 = ((CopyVisitor) obj).get_copy();
    if(temp18 == null && temp19 == null) {}
    else if(temp18 == null ||
            temp19 == null ||
            !temp18.equals(temp19)) { is_equal = false; return; }
  }}

  before SubgraphVisitor {{
    Object obj = history.peek();
    is_equal = is_equal && obj.getClass().equals(host.getClass());
    if(!is_equal) return;
    is_equal = is_equal && host.get_is_equal() == ((SubgraphVisitor) obj).get_is_equal();
  }}

  before EqualVisitor {{
    Object obj = history.peek();
    is_equal = is_equal && obj.getClass().equals(host.getClass());
    if(!is_equal) return;
    is_equal = is_equal && host.get_is_equal() == ((EqualVisitor) obj).get_is_equal();
  }}

  before DisplayVisitor {{
    Object obj = history.peek();
    is_equal = is_equal && obj.getClass().equals(host.getClass());
    if(!is_equal) return;
    is_equal = is_equal && host.get_indent() == ((DisplayVisitor) obj).get_indent();
  }}

  before TraceVisitor {{
    Object obj = history.peek();
    is_equal = is_equal && obj.getClass().equals(host.getClass());
    if(!is_equal) return;
    is_equal = is_equal && host.get_indent() == ((TraceVisitor) obj).get_indent();
  }}

  before UniversalVisitor {{
    Object obj = history.peek();
    is_equal = is_equal && obj.getClass().equals(host.getClass());
    if(!is_equal) return;
  }}

  before -> Bus_List, first, Nonempty_Bus_List {{
    if (is_equal) {
      Bus_List obj = (Bus_List) history.peek();
      Object temp20 = obj.get_first();
      if(temp20==null) { is_equal = false; return; }
      history.push(temp20);
    }
  }}
  after -> Bus_List, first, Nonempty_Bus_List {{
    if (is_equal) history.pop();
  }}

  before Bus_List {{
    Object obj = history.peek();
    is_equal = is_equal && obj.getClass().equals(host.getClass());
    if(!is_equal) return;
  }}

  before -> Town_List, first, Nonempty_Town_List {{
    if (is_equal) {
      Town_List obj = (Town_List) history.peek();
      Object temp21 = obj.get_first();
      if(temp21==null) { is_equal = false; return; }
      history.push(temp21);
    }
  }}
  after -> Town_List, first, Nonempty_Town_List {{
    if (is_equal) history.pop();
  }}

  before Town_List {{
    Object obj = history.peek();
    is_equal = is_equal && obj.getClass().equals(host.getClass());
    if(!is_equal) return;
  }}

  before -> Person_List, first, Nonempty_Person_List {{
    if (is_equal) {
      Person_List obj = (Person_List) history.peek();
      Object temp22 = obj.get_first();
      if(temp22==null) { is_equal = false; return; }
      history.push(temp22);
    }
  }}
  after -> Person_List, first, Nonempty_Person_List {{
    if (is_equal) history.pop();
  }}

  before Person_List {{
    Object obj = history.peek();
    is_equal = is_equal && obj.getClass().equals(host.getClass());
    if(!is_equal) return;
  }}

  before -> BusStop_List, first, Nonempty_BusStop_List {{
    if (is_equal) {
      BusStop_List obj = (BusStop_List) history.peek();
      Object temp23 = obj.get_first();
      if(temp23==null) { is_equal = false; return; }
      history.push(temp23);
    }
  }}
  after -> BusStop_List, first, Nonempty_BusStop_List {{
    if (is_equal) history.pop();
  }}

  before BusStop_List {{
    Object obj = history.peek();
    is_equal = is_equal && obj.getClass().equals(host.getClass());
    if(!is_equal) return;
  }}

  before -> Nonempty_Bus_List, it, Bus {{
    if (is_equal) {
      Nonempty_Bus_List obj = (Nonempty_Bus_List) history.peek();
      Object temp24 = obj.get_it();
      if(temp24==null) { is_equal = false; return; }
      history.push(temp24);
    }
  }}
  after -> Nonempty_Bus_List, it, Bus {{
    if (is_equal) history.pop();
  }}

  before -> Nonempty_Bus_List, next, Nonempty_Bus_List {{
    if (is_equal) {
      Nonempty_Bus_List obj = (Nonempty_Bus_List) history.peek();
      Object temp25 = obj.get_next();
      if(temp25==null) { is_equal = false; return; }
      history.push(temp25);
    }
  }}
  after -> Nonempty_Bus_List, next, Nonempty_Bus_List {{
    if (is_equal) history.pop();
  }}

  before Nonempty_Bus_List {{
    Object obj = history.peek();
    is_equal = is_equal && obj.getClass().equals(host.getClass());
    if(!is_equal) return;
  }}

  before -> Nonempty_Town_List, it, Town {{
    if (is_equal) {
      Nonempty_Town_List obj = (Nonempty_Town_List) history.peek();
      Object temp26 = obj.get_it();
      if(temp26==null) { is_equal = false; return; }
      history.push(temp26);
    }
  }}
  after -> Nonempty_Town_List, it, Town {{
    if (is_equal) history.pop();
  }}

  before -> Nonempty_Town_List, next, Nonempty_Town_List {{
    if (is_equal) {
      Nonempty_Town_List obj = (Nonempty_Town_List) history.peek();
      Object temp27 = obj.get_next();
      if(temp27==null) { is_equal = false; return; }
      history.push(temp27);
    }
  }}
  after -> Nonempty_Town_List, next, Nonempty_Town_List {{
    if (is_equal) history.pop();
  }}

  before Nonempty_Town_List {{
    Object obj = history.peek();
    is_equal = is_equal && obj.getClass().equals(host.getClass());
    if(!is_equal) return;
  }}

  before -> Nonempty_Person_List, it, Person {{
    if (is_equal) {
      Nonempty_Person_List obj = (Nonempty_Person_List) history.peek();
      Object temp28 = obj.get_it();
      if(temp28==null) { is_equal = false; return; }
      history.push(temp28);
    }
  }}
  after -> Nonempty_Person_List, it, Person {{
    if (is_equal) history.pop();
  }}

  before -> Nonempty_Person_List, next, Nonempty_Person_List {{
    if (is_equal) {
      Nonempty_Person_List obj = (Nonempty_Person_List) history.peek();
      Object temp29 = obj.get_next();
      if(temp29==null) { is_equal = false; return; }
      history.push(temp29);
    }
  }}
  after -> Nonempty_Person_List, next, Nonempty_Person_List {{
    if (is_equal) history.pop();
  }}

  before Nonempty_Person_List {{
    Object obj = history.peek();
    is_equal = is_equal && obj.getClass().equals(host.getClass());
    if(!is_equal) return;
  }}

  before -> Nonempty_BusStop_List, it, BusStop {{
    if (is_equal) {
      Nonempty_BusStop_List obj = (Nonempty_BusStop_List) history.peek();
      Object temp30 = obj.get_it();
      if(temp30==null) { is_equal = false; return; }
      history.push(temp30);
    }
  }}
  after -> Nonempty_BusStop_List, it, BusStop {{
    if (is_equal) history.pop();
  }}

  before -> Nonempty_BusStop_List, next, Nonempty_BusStop_List {{
    if (is_equal) {
      Nonempty_BusStop_List obj = (Nonempty_BusStop_List) history.peek();
      Object temp31 = obj.get_next();
      if(temp31==null) { is_equal = false; return; }
      history.push(temp31);
    }
  }}
  after -> Nonempty_BusStop_List, next, Nonempty_BusStop_List {{
    if (is_equal) history.pop();
  }}

  before Nonempty_BusStop_List {{
    Object obj = history.peek();
    is_equal = is_equal && obj.getClass().equals(host.getClass());
    if(!is_equal) return;
  }}

  return boolean {{ is_equal }}
}