anchor.diff:      ] |> Seq.filter (not << String.IsNullOrEmpty) |> String.concat " "
   
   
  +let private md5 (data : byte array) : string =
  +    use md5 = MD5.Create()
  +    (StringBuilder(), md5.ComputeHash(data))
  +    ||> Array.fold (fun sb b -> sb.Append(b.ToString("x2")))
  +    |> string
  +
  +
   /// Install dotnet cli if required
   /// ## Parameters
   ///
  
positive.code: /// - 'dotnetCliDir' - dotnet cli install directory 
  let private dotnetCliPath dotnetCliDir = dotnetCliDir @@ "dotnet.exe"
  
  // Temporary path of installer script
  let private tempInstallerScript = Path.GetTempPath() @@ "dotnet_install.ps1"
  
  let private downloadInstaller fileName =  
      let installScript = Http.RequestStream dotnetCliInstaller
      use outFile = File.Open(fileName, FileMode.Create)
      installScript.ResponseStream.CopyTo(outFile)
      trace (sprintf "downloaded dotnet installer to %s" fileName)
  
negative.code: type DotnetCliChannel =
      /// Possibly unstable, frequently changing, may contain new finished and unfinished features
      | Future
      /// Most stable releases
      | Production
      /// Custom channel
      | Channel of string
      
  /// dotnet cli install options
  type DotNetCliInstallOptions =
      {   
          /// Always download install script (otherwise install script is cached in temporary folder)
          AlwaysDownload: bool;
          /// Download installer from this github branch
          InstallerBranch: string;
          /// Distribution channel
          Channel: DotnetCliChannel;
          /// DotnetCli version
  