anchor.diff:      | Install
       | UpdateAll
   
  +type ResolverStep = {
  +    Relax: bool
  +    FilteredVersions : Map<PackageName, ((SemVerInfo * PackageSource list) list * bool)>
  +    CurrentResolution : Map<PackageName,ResolvedPackage>;
  +    ClosedRequirements : Set<PackageRequirement>
  +    OpenRequirements : Set<PackageRequirement> }
  +
   /// Resolves all direct and transitive dependencies
   let Resolve(getVersionsF, getPackageDetailsF, groupName:GroupName, globalStrategyForDirectDependencies, globalStrategyForTransitives, globalFrameworkRestrictions, (rootDependencies:PackageRequirement Set), updateMode : UpdateMode) =
       tracefn "Resolving packages for group %O:" groupName
  
positive.code:                 lastConflictReported := DateTime.Now
          | _ -> ()
    
  
      let rec step (relax,filteredVersions:Map<PackageName, ((SemVerInfo * PackageSource list) list * bool)>,currentResolution:Map<PackageName,ResolvedPackage>,closedRequirements:Set<PackageRequirement>,openRequirements:Set<PackageRequirement>) =
          if Set.isEmpty openRequirements then 
              Resolution.Ok(cleanupNames currentResolution) 
          else
              verbosefn "  %d packages in resolution. %d requirements left" currentResolution.Count openRequirements.Count
          
              let currentRequirement = getCurrentRequirement openRequirements
              let conflicts = getConflicts(filteredVersions,closedRequirements,openRequirements,currentRequirement)
              if conflicts |> Set.isEmpty |> not then 
                  Resolution.Conflict(currentResolution,closedRequirements,openRequirements,conflicts,Seq.head conflicts,getVersionsF currentRequirement.Sources ResolverStrategy.Max groupName) 
              else
                  let availableVersions,compatibleVersions,globalOverride = getCompatibleVersions(relax,filteredVersions,openRequirements,currentRequirement)
  
                  let conflictStatus = Resolution.Conflict(currentResolution,closedRequirements,openRequirements,Set.empty,currentRequirement,getVersionsF currentRequirement.Sources ResolverStrategy.Max groupName)
                  if Seq.isEmpty compatibleVersions then
                      boostConflicts (filteredVersions,currentRequirement,conflictStatus) 
  
                  let ready = ref false
                  let state = ref conflictStatus
  
negative.code: 
                  !state
  
      let startingStep =
          { Relax = false
            FilteredVersions = Map.empty
            CurrentResolution = Map.empty
            ClosedRequirements = Set.empty
            OpenRequirements = rootDependencies }
  
      match step startingStep with
      | Resolution.Conflict(resolved,closed,stillOpen,_,_,_) as conflict ->
          if !tryRelaxed then
              conflictHistory.Clear()
              knownConflicts.Clear() |> ignore
              step { startingStep with Relax = true }
          else
              conflict
      | x -> x
  