Program: 11738
Project: 11738
Buggy source:
/** 
 * Merge the contents of to manifests.
 * @since 2.9
 */
protected String mergeManifest(String oldContents,String newContents){
  List<AttributeData> oldAttributes=getAttributeData(oldContents);
  List<AttributeData> newAttributes=getAttributeData(newContents);
  AttributeData oldBundleLocalization=getAttribute(oldAttributes,"String_Node_Str");
  AttributeData newBundleLocalization=getAttribute(newAttributes,"String_Node_Str");
  boolean mergeTranslatedAttributes=oldBundleLocalization == null || (newBundleLocalization != null && !newBundleLocalization.value.equals(oldBundleLocalization.value));
  for (int i=0, size=oldAttributes.size(); i < size; ++i) {
    AttributeData oldAttribute=oldAttributes.get(i);
    int index=newAttributes.indexOf(oldAttribute);
    if (index != -1) {
      AttributeData newAttribute=newAttributes.get(index);
      newAttribute.value=null;
      if ("String_Node_Str".equals(oldAttribute.name) || "String_Node_Str".equals(oldAttribute.name)) {
        if (mergeTranslatedAttributes) {
          if (oldAttribute.elements == null) {
            oldAttribute.value=newAttribute.value;
          }
 else {
            oldAttribute.elements=newAttribute.elements;
          }
        }
      }
 else       if ("String_Node_Str".equals(oldAttribute.name) || "String_Node_Str".equals(oldAttribute.name)) {
        if (oldAttribute.elements == null) {
          oldAttribute.value=newAttribute.value;
        }
 else {
          oldAttribute.elements=newAttribute.elements;
        }
      }
 else       if ("String_Node_Str".equals(oldAttribute.name) || "String_Node_Str".equals(oldAttribute.name) || "String_Node_Str".equals(oldAttribute.name)) {
        if (newAttribute.elements != null) {
          if (oldAttribute.elements == null) {
            oldAttribute.value=newAttribute.value;
          }
 else {
            LOOP:             for (int j=0, elementSize=newAttribute.elements.size(); j < elementSize; ++j) {
              AttributeData.Element element=newAttribute.elements.get(j);
              int elementIndex=oldAttribute.elements.indexOf(element);
              if (elementIndex == -1) {
                for (int k=j - 1; k >= 0; --k) {
                  int targetIndex=oldAttribute.elements.indexOf(newAttribute.elements.get(k));
                  if (targetIndex != -1) {
                    oldAttribute.elements.add(targetIndex + 1,element);
                    continue LOOP;
                  }
                }
                for (int k=j + 1; k < elementSize; ++k) {
                  int targetIndex=oldAttribute.elements.indexOf(newAttribute.elements.get(k));
                  if (targetIndex != -1) {
                    oldAttribute.elements.add(targetIndex,element);
                    continue LOOP;
                  }
                }
                oldAttribute.elements.add(element);
              }
            }
          }
        }
 else {
          oldAttribute.value=newAttribute.value;
        }
      }
    }
  }
  LOOP:   for (int i=0, size=newAttributes.size(); i < size; ++i) {
    AttributeData newAttribute=newAttributes.get(i);
    if (newAttribute.value != null) {
      for (int j=i - 1; j >= 0; --j) {
        int index=oldAttributes.indexOf(newAttributes.get(j));
        if (index != -1) {
          AttributeData oldAttribute=oldAttributes.get(index);
          oldAttributes.add(index + 1,newAttribute);
          newAttribute.start=newAttribute.end=oldAttribute.end;
          continue LOOP;
        }
      }
      for (int j=i + 1; j < size; ++j) {
        int index=oldAttributes.indexOf(newAttributes.get(j));
        if (index != -1) {
          AttributeData oldAttribute=oldAttributes.get(index);
          oldAttributes.add(index,newAttribute);
          newAttribute.start=newAttribute.end=oldAttribute.start;
          continue LOOP;
        }
      }
      oldAttributes.add(newAttribute);
      newAttribute.start=newAttribute.end=oldAttributes.get(oldAttributes.size() - 1).end;
    }
  }
  StringBuilder result=new StringBuilder();
  int index=0;
  for (int i=0, size=oldAttributes.size(); i < size; ++i) {
    AttributeData oldAttribute=oldAttributes.get(i);
    result.append(oldContents.substring(index,oldAttribute.start));
    result.append(oldAttribute);
    result.append(oldAttribute.lineDelimiter);
    index=oldAttribute.end;
  }
  result.append(oldContents.substring(index));
  return result.toString();
}

Fixed version (ground truth):
/** 
 * Merge the contents of to manifests.
 * @since 2.9
 */
protected String mergeManifest(String oldContents,String newContents){
  List<AttributeData> oldAttributes=getAttributeData(oldContents);
  List<AttributeData> newAttributes=getAttributeData(newContents);
  AttributeData oldBundleLocalization=getAttribute(oldAttributes,"String_Node_Str");
  AttributeData newBundleLocalization=getAttribute(newAttributes,"String_Node_Str");
  boolean mergeTranslatedAttributes=oldBundleLocalization == null || (newBundleLocalization != null && !newBundleLocalization.value.equals(oldBundleLocalization.value));
  for (int i=0, size=oldAttributes.size(); i < size; ++i) {
    AttributeData oldAttribute=oldAttributes.get(i);
    int index=newAttributes.indexOf(oldAttribute);
    if (index != -1) {
      AttributeData newAttribute=newAttributes.get(index);
      if ("String_Node_Str".equals(oldAttribute.name) || "String_Node_Str".equals(oldAttribute.name)) {
        if (mergeTranslatedAttributes) {
          if (oldAttribute.elements == null) {
            oldAttribute.value=newAttribute.value;
          }
 else {
            oldAttribute.elements=newAttribute.elements;
          }
        }
      }
 else       if ("String_Node_Str".equals(oldAttribute.name) || "String_Node_Str".equals(oldAttribute.name)) {
        if (oldAttribute.elements == null) {
          oldAttribute.value=newAttribute.value;
        }
 else {
          oldAttribute.elements=newAttribute.elements;
        }
      }
 else       if ("String_Node_Str".equals(oldAttribute.name) || "String_Node_Str".equals(oldAttribute.name) || "String_Node_Str".equals(oldAttribute.name)) {
        if (newAttribute.elements != null) {
          if (oldAttribute.elements == null) {
            oldAttribute.value=newAttribute.value;
          }
 else {
            LOOP:             for (int j=0, elementSize=newAttribute.elements.size(); j < elementSize; ++j) {
              AttributeData.Element element=newAttribute.elements.get(j);
              int elementIndex=oldAttribute.elements.indexOf(element);
              if (elementIndex == -1) {
                for (int k=j - 1; k >= 0; --k) {
                  int targetIndex=oldAttribute.elements.indexOf(newAttribute.elements.get(k));
                  if (targetIndex != -1) {
                    oldAttribute.elements.add(targetIndex + 1,element);
                    continue LOOP;
                  }
                }
                for (int k=j + 1; k < elementSize; ++k) {
                  int targetIndex=oldAttribute.elements.indexOf(newAttribute.elements.get(k));
                  if (targetIndex != -1) {
                    oldAttribute.elements.add(targetIndex,element);
                    continue LOOP;
                  }
                }
                oldAttribute.elements.add(element);
              }
            }
          }
        }
 else {
        }
      }
      newAttribute.value=null;
    }
  }
  LOOP:   for (int i=0, size=newAttributes.size(); i < size; ++i) {
    AttributeData newAttribute=newAttributes.get(i);
    if (newAttribute.value != null) {
      for (int j=i - 1; j >= 0; --j) {
        int index=oldAttributes.indexOf(newAttributes.get(j));
        if (index != -1) {
          AttributeData oldAttribute=oldAttributes.get(index);
          oldAttributes.add(index + 1,newAttribute);
          newAttribute.start=newAttribute.end=oldAttribute.end;
          continue LOOP;
        }
      }
      for (int j=i + 1; j < size; ++j) {
        int index=oldAttributes.indexOf(newAttributes.get(j));
        if (index != -1) {
          AttributeData oldAttribute=oldAttributes.get(index);
          oldAttributes.add(index,newAttribute);
          newAttribute.start=newAttribute.end=oldAttribute.start;
          continue LOOP;
        }
      }
      oldAttributes.add(newAttribute);
      newAttribute.start=newAttribute.end=oldAttributes.get(oldAttributes.size() - 1).end;
    }
  }
  StringBuilder result=new StringBuilder();
  int index=0;
  for (int i=0, size=oldAttributes.size(); i < size; ++i) {
    AttributeData oldAttribute=oldAttributes.get(i);
    result.append(oldContents.substring(index,oldAttribute.start));
    result.append(oldAttribute);
    result.append(oldAttribute.lineDelimiter);
    index=oldAttribute.end;
  }
  result.append(oldContents.substring(index));
  return result.toString();
}