public boolean equals(final Object o) {
    if (this == o) {
      return true;
    }
    if (o == null || getClass() != o.getClass()) {
      return false;
    }

    final ReportStateKey that = (ReportStateKey) o;

    if (restoreState != that.restoreState) {
      return false;
    }
    if (cursor != that.cursor) {
      return false;
    }
    if (groupLevel != that.groupLevel) {
      return false;
    }
    if (stateCode != that.stateCode) {
      return false;
    }
    if (subreport != that.subreport) {
      return false;
    }
    if (parent != null ? !parent.equals(that.parent) : that.parent != null) {
      return false;
    }
    return true;
  }
 public int hashCode() {
   if (hashCode == null) {
     int result = (parent != null ? parent.hashCode() : 0);
     result = 29 * result + cursor;
     result = 29 * result + stateCode;
     result = 29 * result + groupLevel;
     result = 29 * result + subreport;
     result = 29 * result + (restoreState ? 1 : 0);
     result = 29 * result + (inlineSubReportState ? 1 : 0);
     // noinspection UnnecessaryBoxing
     hashCode = Integer.valueOf(result);
     return result;
   }
   return hashCode.intValue();
 }