anchor.diff:      Inc(StartPoint);
     end;
   
  -  // best path
  +  // best start point (attainable algorithm)
     if (FoundPaths = 0) then goto fill_result;
     StartPoint := FActualInfo.Starts.Buffer.Memory;
  -  if (not AttainableAlgorithm) then
  -  begin
  -
  -    // todo
  -  end else
  -  begin
  -    FActualInfo.FoundPath.Distance := StartPoint.Distance;
  +  BestStartPoint := StartPoint;
  +  Inc(StartPoint);
  +  for i := Params.StartsCount downto 2 do
  +  begin
  +    if (StartPoint.DistanceAsInt64 < BestStartPoint.DistanceAsInt64) then
  +      BestStartPoint := StartPoint;
  +
       Inc(StartPoint);
  -
  -    for i := Params.StartsCount downto 2 do
  -    begin
  -      if (StartPoint.DistanceAsInt64 < FActualInfo.FoundPath.DistanceAsInt64) then
  -      begin
  -        FActualInfo.FoundPath.Index := (NativeUInt(StartPoint) - NativeUInt(FActualInfo.Starts.Buffer.Memory)) div SizeOf(TCPFStart);
  -        FActualInfo.FoundPath.Distance := StartPoint.Distance;
  -      end;
  -
  -      Inc(StartPoint);
  -    end;
  -  end;
  +  end;
  +  FillAttainablePath(BestStartPoint);
   
     // found path
   fill_result:
  
positive.code:     // allocate start node
      Node := AllocateHeuristedNode(StartPoint.X, StartPoint.Y);
      StartPoint.Node := Node;
      if (Node.NodeInfo and FLAG_KNOWN_PATH <> 0) then
      begin
        StartPoint.AttainableNode := Node;
  
negative.code:     begin
        path_found:
  
        if (AttainableAlgorithm) then
        begin
          CacheAttainableNodes(StartPoint, FinishNode);
          // another interface?
          // todo
        end else
        begin
          FillFoundPath(StartPoint, FinishNode);
          goto fill_result;
        end;
      end else
      begin
        path_not_found:
  