Program: 169442
Project: 169442
Buggy source:
protected List<IConnection<IRedstoneDevice>> performPropagation(){
  List<IConnection<IRedstoneDevice>> connections=new ArrayList<IConnection<IRedstoneDevice>>();
  IConnection<IRedstoneDevice> firstCon=(IConnection<IRedstoneDevice>)getDevice().getRedstoneConnectionCache().getConnectionOnSide(getSide());
  if (firstCon != null)   connections.add(firstCon);
  List<IConnection<IRedstoneDevice>> current=new ArrayList<IConnection<IRedstoneDevice>>();
  for (  Entry<IConnection<IRedstoneDevice>,Boolean> p : getPropagation(getDevice(),getSide())) {
    if (p.getValue()) {
      schedule(new RedPropagator(p.getKey().getB(),p.getKey().getSideB()));
    }
 else {
      if (p.getKey().getB() instanceof IRedstoneConductor && ((IRedstoneConductor)p.getKey().getB()).hasLoss(p.getKey().getSideB()) != (this instanceof LossyPropagator)) {
        schedule(new RedPropagator(p.getKey().getB(),p.getKey().getSideB()));
      }
 else {
        current.add(p.getKey());
      }
    }
  }
  if (current.size() == 0 && connections.size() == 0)   return connections;
  List<IConnection<IRedstoneDevice>> newDevices=new ArrayList<IConnection<IRedstoneDevice>>();
  while (current.size() > 0) {
    List<Entry<IConnection<IRedstoneDevice>,Boolean>> tmp=new ArrayList<Entry<IConnection<IRedstoneDevice>,Boolean>>();
    for (    IConnection<IRedstoneDevice> c : current) {
      tmp.addAll(getPropagation(c.getB(),c.getSideB()));
      for (      Entry<IConnection<IRedstoneDevice>,Boolean> p : tmp) {
        if (p.getValue()) {
          schedule(new RedPropagator(p.getKey().getB(),p.getKey().getSideB()));
        }
 else         if (!connections.contains(p)) {
          newDevices.add(p.getKey());
        }
      }
      tmp.clear();
    }
    connections.addAll(current);
    current.clear();
    for (    IConnection<IRedstoneDevice> c : newDevices)     if (!connections.contains(c))     current.add(c);
    newDevices.clear();
  }
  return connections;
}

Fixed version (ground truth):
protected List<IConnection<IRedstoneDevice>> performPropagation(){
  List<IConnection<IRedstoneDevice>> connections=new ArrayList<IConnection<IRedstoneDevice>>();
  IConnection<IRedstoneDevice> firstCon=(IConnection<IRedstoneDevice>)getDevice().getRedstoneConnectionCache().getConnectionOnSide(getSide());
  if (firstCon != null)   connections.add(firstCon);
  List<IConnection<IRedstoneDevice>> current=new ArrayList<IConnection<IRedstoneDevice>>();
  for (  Entry<IConnection<IRedstoneDevice>,Boolean> p : getPropagation(getDevice(),getSide())) {
    if (p.getValue()) {
      schedule(new RedPropagator(p.getKey().getB(),p.getKey().getSideB()));
    }
 else {
      if (p.getKey().getB() instanceof IRedstoneConductor && ((IRedstoneConductor)p.getKey().getB()).hasLoss(p.getKey().getSideB()) != (this instanceof LossyPropagator)) {
        schedule(new RedPropagator(p.getKey().getB(),p.getKey().getSideB()));
      }
 else {
        current.add(p.getKey());
      }
    }
  }
  if (current.size() == 0 && connections.size() == 0)   return connections;
  List<IConnection<IRedstoneDevice>> newDevices=new ArrayList<IConnection<IRedstoneDevice>>();
  List<Entry<IConnection<IRedstoneDevice>,Boolean>> tmp=new ArrayList<Entry<IConnection<IRedstoneDevice>,Boolean>>();
  while (current.size() > 0) {
    for (    IConnection<IRedstoneDevice> c : current) {
      tmp.addAll(getPropagation(c.getB(),c.getSideB()));
      for (      Entry<IConnection<IRedstoneDevice>,Boolean> p : tmp)       if (p.getValue())       schedule(new RedPropagator(p.getKey().getB(),p.getKey().getSideB()));
 else       if (!connections.contains(p) && !current.contains(p) && !tmp.contains(p))       newDevices.add(p.getKey());
      tmp.clear();
    }
    for (    IConnection<IRedstoneDevice> c : current)     if (!connections.contains(c))     connections.add(c);
    current.clear();
    for (    IConnection<IRedstoneDevice> c : newDevices)     if (!connections.contains(c))     current.add(c);
    newDevices.clear();
  }
  return connections;
}