anchor.diff:  
       loop ""
   
  -let getContent (client : Amazon.S3.IAmazonS3) (bucket : Amazon.S3.Model.S3Bucket) (s3Object : Amazon.S3.Model.S3Object) =
  +/// Returns all the versions for the specified S3 object
  +let getObjectVersions (client : Amazon.S3.IAmazonS3) (bucket : Amazon.S3.Model.S3Bucket) (s3Object : Amazon.S3.Model.S3Object) =
  +    let rec loop marker = seq {
  +        let req = new Amazon.S3.Model.ListVersionsRequest()
  +        req.BucketName <- bucket.BucketName
  +        req.Prefix     <- s3Object.Key
  +        if not <| String.IsNullOrWhiteSpace marker then req.VersionIdMarker <- marker
  +
  +        let response = client.ListVersions(req)
  +        yield! response.Versions
  +
  +        if not <| String.IsNullOrWhiteSpace response.NextVersionIdMarker then yield! loop response.NextVersionIdMarker
  +    }
  +
  +    loop ""
  +
  +/// Returns the content (byte[]) of a S3 obejct
  +let getContent (client : Amazon.S3.IAmazonS3) (bucket : Amazon.S3.Model.S3Bucket) version (s3Object : Amazon.S3.Model.S3Object) =
       let req = new Amazon.S3.Model.GetObjectRequest()
       req.BucketName <- bucket.BucketName
       req.Key        <- s3Object.Key
  +    match version with
  +    | Some versionId -> req.VersionId <- versionId
  +    | _ -> ()
  +
       let response  = client.GetObject(req)
       use memStream = new System.IO.MemoryStream()
  -    response.ResponseStream.CopyTo(memStream)    
  +    response.ResponseStream.CopyTo(memStream)
       memStream.ToArray()
   
   module RuntimeHelper = 
  
positive.code:     let getUtf8String   = System.Text.Encoding.UTF8.GetString
      let getAsciiString  = System.Text.Encoding.ASCII.GetString
  
  let createTypedContent (ownerType : ProvidedTypeDefinition) client (bucket : Amazon.S3.Model.S3Bucket) (s3Object : Amazon.S3.Model.S3Object) = 
      let contents     = getContent client bucket s3Object
      let typedContent = runtimeType<string> "Content"
      typedContent.HideObjectMethods <- true
  
      typedContent.AddMemberDelayed(fun () -> ProvidedProperty("UTF8", typeof<string>, IsStatic = true, GetterCode = (fun args -> <@@ RuntimeHelper.getUtf8String(contents) @@>)))
      typedContent.AddMemberDelayed(fun () -> ProvidedProperty("ASCII", typeof<string>, IsStatic = true, GetterCode = (fun args -> <@@ RuntimeHelper.getAsciiString(contents) @@>)))
      typedContent.AddMember(ProvidedProperty("Raw", typeof<byte[]>, IsStatic = true, GetterCode = (fun args -> <@@ contents @@>)))
      typedContent
  
  let createTypedS3Object (ownerType : ProvidedTypeDefinition) client (bucket : Amazon.S3.Model.S3Bucket) (s3Object : Amazon.S3.Model.S3Object) = 
      let typedS3Object = runtimeType<obj> s3Object.Key
      typedS3Object.AddXmlDocDelayed(fun () -> sprintf "A strongly typed interface to S3 object %s which is %d bytes in size" s3Object.Key s3Object.Size)
      typedS3Object.HideObjectMethods <- true
      
      let key, etag, size, lastModified, ownerId, ownerName = 
          s3Object.Key, s3Object.ETag, s3Object.Size, s3Object.LastModified.ToString(), s3Object.Owner.Id, s3Object.Owner.DisplayName
  
negative.code:             typedS3Account
  
      typedS3.DefineStaticParameters(parameters = typeParams, instantiationFunction = initFunction)
      typedS3
  
  [<TypeProvider>]
  