// 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 -> FileSystem, root, CompoundFile {{
    if (is_equal) {
      FileSystem obj = (FileSystem) history.peek();
      Object temp1 = obj.get_root();
      if(temp1==null) { is_equal = false; return; }
      history.push(temp1);
    }
  }}
  after -> FileSystem, root, CompoundFile {{
    if (is_equal) history.pop();
  }}

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

  before -> File, f, FileName {{
    if (is_equal) {
      File obj = (File) history.peek();
      Object temp2 = obj.get_f();
      if(temp2==null) { is_equal = false; return; }
      history.push(temp2);
    }
  }}
  after -> File, f, FileName {{
    if (is_equal) history.pop();
  }}

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

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

  before -> CompoundFile, contents, File_PList {{
    if (is_equal) {
      CompoundFile obj = (CompoundFile) history.peek();
      Object temp3 = obj.get_contents();
      if(temp3==null) { is_equal = false; return; }
      history.push(temp3);
    }
  }}
  after -> CompoundFile, contents, File_PList {{
    if (is_equal) history.pop();
  }}

  before -> CompoundFile, parent, CompoundFile {{
    if (is_equal) {
      CompoundFile obj = (CompoundFile) history.peek();
      Object temp4 = obj.get_parent();
      if(temp4==null) { is_equal = false; return; }
      history.push(temp4);
    }
  }}
  after -> CompoundFile, parent, CompoundFile {{
    if (is_equal) history.pop();
  }}

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

  before -> Commands, command_list, Command_List {{
    if (is_equal) {
      Commands obj = (Commands) history.peek();
      Object temp5 = obj.get_command_list();
      if(temp5==null) { is_equal = false; return; }
      history.push(temp5);
    }
  }}
  after -> Commands, command_list, Command_List {{
    if (is_equal) history.pop();
  }}

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

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

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

  before -> MakeDirectory, directoryname, DirectoryName {{
    if (is_equal) {
      MakeDirectory obj = (MakeDirectory) history.peek();
      Object temp6 = obj.get_directoryname();
      if(temp6==null) { is_equal = false; return; }
      history.push(temp6);
    }
  }}
  after -> MakeDirectory, directoryname, DirectoryName {{
    if (is_equal) history.pop();
  }}

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

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

  before -> ChangeDirectoryDown, directoryname, DirectoryName {{
    if (is_equal) {
      ChangeDirectoryDown obj = (ChangeDirectoryDown) history.peek();
      Object temp7 = obj.get_directoryname();
      if(temp7==null) { is_equal = false; return; }
      history.push(temp7);
    }
  }}
  after -> ChangeDirectoryDown, directoryname, DirectoryName {{
    if (is_equal) history.pop();
  }}

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

  before -> RecursiveCopy, source, FileName {{
    if (is_equal) {
      RecursiveCopy obj = (RecursiveCopy) history.peek();
      Object temp8 = obj.get_source();
      if(temp8==null) { is_equal = false; return; }
      history.push(temp8);
    }
  }}
  after -> RecursiveCopy, source, FileName {{
    if (is_equal) history.pop();
  }}

  before -> RecursiveCopy, target, FileName {{
    if (is_equal) {
      RecursiveCopy obj = (RecursiveCopy) history.peek();
      Object temp9 = obj.get_target();
      if(temp9==null) { is_equal = false; return; }
      history.push(temp9);
    }
  }}
  after -> RecursiveCopy, target, FileName {{
    if (is_equal) history.pop();
  }}

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

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

  before -> SymbolicLink, from, FileName {{
    if (is_equal) {
      SymbolicLink obj = (SymbolicLink) history.peek();
      Object temp10 = obj.get_from();
      if(temp10==null) { is_equal = false; return; }
      history.push(temp10);
    }
  }}
  after -> SymbolicLink, from, FileName {{
    if (is_equal) history.pop();
  }}

  before -> SymbolicLink, to, FileName {{
    if (is_equal) {
      SymbolicLink obj = (SymbolicLink) history.peek();
      Object temp11 = obj.get_to();
      if(temp11==null) { is_equal = false; return; }
      history.push(temp11);
    }
  }}
  after -> SymbolicLink, to, FileName {{
    if (is_equal) history.pop();
  }}

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

  before -> RemoveDirectory, directoryname, DirectoryName {{
    if (is_equal) {
      RemoveDirectory obj = (RemoveDirectory) history.peek();
      Object temp12 = obj.get_directoryname();
      if(temp12==null) { is_equal = false; return; }
      history.push(temp12);
    }
  }}
  after -> RemoveDirectory, directoryname, DirectoryName {{
    if (is_equal) history.pop();
  }}

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

  before -> CreateEmptyFile, filename, FileName {{
    if (is_equal) {
      CreateEmptyFile obj = (CreateEmptyFile) history.peek();
      Object temp13 = obj.get_filename();
      if(temp13==null) { is_equal = false; return; }
      history.push(temp13);
    }
  }}
  after -> CreateEmptyFile, filename, FileName {{
    if (is_equal) history.pop();
  }}

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

  before -> RemoveFile, filename, FileName {{
    if (is_equal) {
      RemoveFile obj = (RemoveFile) history.peek();
      Object temp14 = obj.get_filename();
      if(temp14==null) { is_equal = false; return; }
      history.push(temp14);
    }
  }}
  after -> RemoveFile, filename, FileName {{
    if (is_equal) history.pop();
  }}

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

  before -> Find, directoryname, DirectoryName {{
    if (is_equal) {
      Find obj = (Find) history.peek();
      Object temp15 = obj.get_directoryname();
      if(temp15==null) { is_equal = false; return; }
      history.push(temp15);
    }
  }}
  after -> Find, directoryname, DirectoryName {{
    if (is_equal) history.pop();
  }}

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

  before -> Echo, message, Message {{
    if (is_equal) {
      Echo obj = (Echo) history.peek();
      Object temp16 = obj.get_message();
      if(temp16==null) { is_equal = false; return; }
      history.push(temp16);
    }
  }}
  after -> Echo, message, Message {{
    if (is_equal) history.pop();
  }}

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

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

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

  before Message {{
    Object obj = history.peek();
    is_equal = is_equal && obj.getClass().equals(host.getClass());
    if(!is_equal) return;
    Object temp21 = host.get_string();
    Object temp22 = ((Message) obj).get_string();
    if(temp21 == null && temp22 == null) {}
    else if(temp21 == null ||
            temp22 == null ||
            !temp21.equals(temp22)) { is_equal = false; return; }
  }}

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

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

  before FileNameVisitor {{
    Object obj = history.peek();
    is_equal = is_equal && obj.getClass().equals(host.getClass());
    if(!is_equal) 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 temp23 = host.get_copy();
    Object temp24 = ((CopyVisitor) obj).get_copy();
    if(temp23 == null && temp24 == null) {}
    else if(temp23 == null ||
            temp24 == null ||
            !temp23.equals(temp24)) { 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 -> File_PList, first, Nonempty_File_PList {{
    if (is_equal) {
      File_PList obj = (File_PList) history.peek();
      Object temp25 = obj.get_first();
      if(temp25==null) { is_equal = false; return; }
      history.push(temp25);
    }
  }}
  after -> File_PList, first, Nonempty_File_PList {{
    if (is_equal) history.pop();
  }}

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

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

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

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

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

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

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

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

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

  return boolean {{ is_equal }}
}