new_contents: from .a_star import AStarFinder, MAX_RUNS, TIME_LIMIT
  from pathfinding.core.diagonal_movement import DiagonalMovement
  
  
  class BestFirst(AStarFinder):
      """
      Similar to the default A* algorithm from a_star.
      """
      def __init__(self, heuristic=None, weight=1,
                   diagonal_movement=DiagonalMovement.never,
                   time_limit=TIME_LIMIT,
                   max_runs=MAX_RUNS):
          """
          find shortest path using BestFirst algorithm
          :param heuristic: heuristic used to calculate distance of 2 points
              (defaults to manhatten)
          :param weight: weight for the edges
          :param diagonal_movement: if diagonal movement is allowed
              (see enum in diagonal_movement)
          :param time_limit: max. runtime in seconds
          :param max_runs: max. amount of tries until we abort the search
              (optional, only if we enter huge grids and have time constrains)
              <=0 means there are no constrains and the code might run on any
              large map.
          """
          super(BestFirst, self).__init__(
              heuristic=heuristic,
              weight=weight,
              diagonal_movement=diagonal_movement,
              time_limit=time_limit,
              max_runs=max_runs)
  
          self.weighted = False
  
      def apply_heuristic(self, node_a, node_b, heuristic=None):
          return super(BestFirst, self).apply_heuristic(
              node_a, node_b, heuristic) * 1000000
  
subject: add BestFirstSearch (#3)